Docker 정리

Docker

** 도커 이미지와 컨테이너

- 이미지와 컨테이너는 도커에서 사용하는 가장 기본적인 단위로 이미지와 컨테이너는 1:N 관계를 가진다
- 이미지는 컨테이너를 생성할 때 필요한 요소로 컨테이너의 목적에 맞는 바이너리와 의존성이 설치되어있다. (여러개의 계층으로 된 바이너리 파일로 존재)
- 컨테이너는 호스트 또는 다른 컨테이너로부터 격리된 시스템 자원과 네트워크를 사용하는 프로세스로 이미지는 읽기 전용으로 사용하여 변경사항은 컨테이너 계층에 저장한다.
- 컨테이너에서 무엇을 하든 이미지에 영향을 주지 않는다.

#컨테이너간 DB 연결

$ docker run -d --name wordpressdb -e MYSQL\_ROOT\_PASSWORD=password -e MYSQL\_DATABASE=wordpress mysql:5.7  
$ docker run -d --name wordpress -e WORDPRESS\_DB\_HOST=mysql -e WORDPRESS\_DB\_USER=root -e WORDPRESS\_DB\_PASSWORD=password --link wordpressdb:mysql -p 80 wordpress  
$ docker run -i -t --name mysql\_attach\_test -e MYSQL\_ROOT\_PASSWORD=password -e MYSQL\_DATABASE=wordpress mysql:5.7  

#볼륨 지정

$ docker run -d --name wordpressdb\_hostvolume -e MYSQL\_ROOT\_PASSWORD=password -e MYSQL\_DATABASE=wordpress -v C:\\[dockerDB:/var/lib/mysql](http://dockerDB/var/lib/mysql) mysql:5.7  
$ docker run -d -e WORDPRESS\_DB\_PASSWORD=password --name wordpress\_hostvolume --link wordpressdb\_hostvolume:mysql -p 80 wordpress  

#네트워크 브리지

$ docker network create --driver bridge mybridge  
$ docker network inspect bridge  
$ docker run -i -t --name mynetwork\_container --net mybridge ubuntu:14.04
$ docker network disconnect mybridge mynetwork\_container  
$ docker network connect mybridge mynetwork\_container
$ docker run -i -t -d --name network\_container\_1 ubuntu:14.04  
$ docker run -i -t -d --name network\_container\_2 --net container:network\_container\_1 ubuntu:14.04  
$ docker exec network\_container\_1 ifconfig 완전히 같은 IP 주소  
$ docker exec network\_container\_2 ifconfig 완전히 같은 IP 주소
$ docker network ls # 네트워크 종류 나열
$ docker run -i -t -d --name network\_alias\_container1 --net mybridge --net-alias alicek106 ubuntu:14.04  
$ docker run -i -t -d --name network\_alias\_container2 --net mybridge --net-alias alicek106 ubuntu:14.04  
$ docker run -i -t -d --name network\_alias\_container3 --net mybridge --net-alias alicek106 ubuntu:14.04
$ docker inspect network\_alias\_container1  
$ docker inspect network\_alias\_container2  
$ docker inspect network\_alias\_container3
$ docker run -i -t --name network\_alias\_ping --net mybridge ubuntu:14.04

#라운드로빈

$ docker exec -i -t {container\_id \_2~4} /bin/bash  
$ ping -c 1 alicek106 # 반복 할때마다 IP주소가 다름

$ apt-get update  
$ apt-get install dnsutils  
$ dig alicek106 # 반복 할때마다 순서가 다름, 이 중 맨 위에 아이피를 반환

#컨테이너 로깅

$ docker run -d --name mysql -e MYSQL\_ROOT\_PASSWORD=1234 mysql:5.7  
$ docker logs mysql  
$ docker run -d --name no\_passwd\_mysql mysql:5.7  
$ docker logs no\_passwd\_mysql  
$ docker logs --tail 2 mysql  
$ docker logs -f -t mysql

$ docker run -i -t --name logstest ubuntu:14.04
# echo test!
$ docker logs logstest

#로그파일 용량분할

$ docker run -it --log-opt max-size=10k --log-opt max-file=3 --name log-test ubuntu:14.04

syslog로그

$ docker run -d --name syslog\_container --log-driver=syslog ubuntu:14.04 echo syslogtest # 윈도우에서는 안됨

#fluentd 로깅 - -- 도커서버 -> fluentd 서버 -> 몽고DB

$ docker run --name mongoDB -d -p 27017:27017 mongo # 몽고DB서버에서 가능  
$ docker run -d --name fluentd -p 24224:24224 -v C:\\dockerDBandPrt\\fluent.[conf:/fluentd/etc/fluent.conf](http://conf/fluentd/etc/fluent.conf) -e FLUENTD\_CONF=fluent.conf alicek106/fluentd:mongo #fluentd 서버에서 가능  
$ docker run -p 80:80 -d --log-driver=fluentd --log-opt fluentd-address=192.168.0.136:24224 --log-opt tag=docker.nginx.webserver nginx

#컨테이너 메모리제한

$ docker run -d --memory="1g" --name memory\_1g nginx  
$ docker inspect memory\_1g  
$ docker run -d --name memory\_4m --memory="6m" mysql:5.7 # 메모리가 부족하여 실행되지 않음  
$ docker run -it --name swap\_500m --memory=200m --memory-swap=500m ubuntu:14.04 # 기본적으로 swap 메모리 500MB, 메모리 200MB로 지정함

#컨테이너 CPU제한

$ docker run -i -t --name cpu\_share --cpu-shares 1024 ubuntu:14.04

....

#도커 이미지 생성

$ docker run -i -t --name commit\_test ubuntu:14.04  
$ echo test\_first! >> first  
$ docker commit -a "alicek106" -m "my first commit" commit\_test commit\_test:first  
$ docker images  
$ docker run -i -t --name commit\_test2 commit\_test:first  
$ echo test\_second! >> second  
$ docker commit -a "alieck106" -m "my second commit" commit\_test2 commit\_test:second

#도커 이미지 삭제

$ docker rmi commit\_test:first

#컨테이너에서 사용중인 이미지를 강제로 삭제한경우 이미지 이름이 로 바뀜 - 이를 댕글링 이미지라고 한다.

$ docker images -f dangling=true 로 확인 가능  
$ docker stop commit\_test2  
$ docker rm commit\_test2  
$ docker rmi commit\_test:first

> Untagged: commit\_test:first # 이미지를 사용중인 컨테이너가 존재하여 이름만 삭제  
> $ docker rmi commit\_test:second # 사용중인 컨테이너가 없으므로 바로 삭제  
> Deleted: sha256:2eda02a0b0564298ce3fb95799c30c682be4acb066bc980ff20bc8a45c098837  
> Deleted: sha256:512a514b8ebdeac30af5cc06e35c13909b8f64a1d8aea9c2c04f6686f0bed4fd  
> Deleted: sha256:9cd515720e38bf4c14c86591455f2c7265340e6ee5dbf84da2425e855830265a  
> Deleted: sha256:3a2bf32d2c1d87f7bdaa7cf45847673154ca3f73b4faadc2ac98acf875bcd5cc

# 이미지 추출

$ docker save -o ubuntu\_14\_04.tar ubuntu:14.04  
$ docker load -i .\\ubuntu\_14\_04.tar

# 도커 허브에 이미지 올리기

$ docker run -i -t --name commit\_container1 ubuntu:14.04  
$ echo my first push >> test

$ docker commit commit\_container1 my-image-name:0.0  
$ docker tag my-image-name:0.0 tthinbee/my-image-name:0.0  
$ docker push tthinbee/my-image-name:0.0  

-- 내려받기 :

$ docker pull tthinbee/my-image-name:0.0

** Dockerfile 생성
- 기본적인 도커이미지 생성 방법
1. 도커허브에 있는 이미지를 이용하여 컨테이너 생성
2. 애플리케이션 설치
3. 컨테이너 커밋
-> 새로운이미지

- Dockerfile 로 이미지를 생성하는 방법
1. Dockerfile 작성 -> 새로운이미지
└ 설치해야하는 패키지, 추가해야하는 소스코드, 실행해야하는 명령어와 셸 스크립트를 하나의 파일에 기록한 파일

# Dockerfile 빌드(build) --> 이름이 Dockerfile 인 경우

$ docker build -t mybuild:0.0 ./

# 빌드된 도커이미지로 컨테이너 생성

$ docker run -d -P --name myserver mybuild:0.0

# Dockerfile 빌드(build) --> 이름이 Dockerfile 이 아닌 경우 도커파일명 명시

$ docker build -f Dockerfile2 -t mycache:0.0 ./

# 캐시를사용하지 않고 처음부터 다시 빌드

$ docker build --no-cache -t mybuild:0.0 ./  
$ docker build --cache-from nginx -t my\_extend\_nginx:0.0 ./

'DevOps와 Infra > Docker' 카테고리의 다른 글

Docker Run  (0) 2023.08.02
Docker Install - EC2  (0) 2023.08.02
Docker 기본  (0) 2023.07.27
Docker Image -> Nexus Push  (0) 2023.04.13
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유