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 |