반응형
2장. 도커 엔진
2.1 도커 이미지와 컨테이너
2.1.1 도커 이미지
- 이미지는 컨테이너를 생성할 때 필요한 요소
- 가상 머신을 생성할 때 사용하는 iso 파일과 비슷한 개념
- 이미지의 형태
- [저장소 이름]/[이미지 이름]:[태그] 형식 이다.
- 태그를 생략하면 도커 엔진은 이미지의 태그를
latest
로 인식한다.
- 태그를 생략하면 도커 엔진은 이미지의 태그를
- 별도로 설치하는게 아니라, 명령어로 이미지를 내려받을 수 있다.
- 이미지는 여러 계층으로 된 바이너리 파일이다.
- 컨테이너를 생성하고 실행할 때 읽기 전용으로 사용한다.
- [저장소 이름]/[이미지 이름]:[태그] 형식 이다.
{repository_name}/{image_name}:{tag}
2.1.2 도커 컨테이너
- 우분투 도커 이미지로
- A 컨테이너 : MySQL 설치
- B 컨테이너 : 아파치 웹 서버 설치
- A와 B는 서로 영향을 주지 않을 뿐더러 호스트에도 아무런 영향을 주지 않는다.
2.2 도커 컨테이너 다루기
대부분 실습 내용 & 도커 관련 명령어 설명
❯ docker -v ─╯
Docker version 27.1.1, build 6312585
- 버전 확인
❯ docker run -i -t ubuntu:14.04 ─╯
Unable to find image 'ubuntu:14.04' locally
14.04: Pulling from library/ubuntu
d1a5a1e51f25: Pull complete
75f8eea31a63: Pull complete
a72d031efbfb: Pull complete
Digest: sha256:64483f3496c1373bfd55348e88694d1c4d0c9b660dee6bfef5e12f43b9933b30
Status: Downloaded newer image for ubuntu:14.04
root@76f769c39c80:/#
- 실행 명령어로 실행과 동시에 컨테이너 내부로 진입
root@76f769c39c80:/# exit
exit
- 컨테이너 빠져나오기
❯ docker pull centos:7 ─╯
7: Pulling from library/centos
6717b8ec66cd: Pull complete
Digest: sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4
Status: Downloaded newer image for centos:7
docker.io/library/centos:7
What's next:
View a summary of image vulnerabilities and recommendations → docker scout quickview centos:7
- centos:7 이미지 pull
❯ docker images ─╯
REPOSITORY TAG IMAGE ID CREATED SIZE
amazon/aws-cli latest d9886e09d4e5 10 months ago 415MB
ubuntu 14.04 55b7b4f7c5d6 22 months ago 187MB
assignment_mock latest d03e076802cc 2 years ago 926MB
madup latest ca8b4fb540bf 2 years ago 402MB
centos 7 c9a1fdca3387 2 years ago 301MB
postgres 9.6.23 8254996af1f9 2 years ago 191MB
- 설치된 이미지들 리스트
❯ docker create -i -t --name mycentos centos:7 ─╯
e6ef4a8dd07c342a9193b98e34b0d8439158f28bb36888006e40e2a6bc62e231
❯ docker start mycentos ─╯
mycentos
❯ docker attach mycentos ─╯
[root@e6ef4a8dd07c /]#
- 컨테이너를
create
명령으로 생성 후 실행한 뒤 컨테이너 내부로 진입하기
❯ docker attach mycentos ─╯
[root@e6ef4a8dd07c /]# read escape sequence
- 컨트롤 + P + Q 로 종료하지 않고 빠져나오기
❯ docker ps ─╯
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e6ef4a8dd07c centos:7 "/bin/bash" 2 minutes ago Up 2 minutes mycentos
97f4e848c81b postgres:9.6.23 "docker-entrypoint.s…" 2 years ago Up 6 days 0.0.0.0:5433->5432/tcp typeorm-nest-db-1
- 현재 생성한 컨테이너 목록 확인
- 정지되지 않은 컨테이너 목록을 출력한다.
exit
명령은 정지 상태이므로 해당 명령어에 의해서는 확인되어지지 않음.
❯ docker ps -a ─╯
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e6ef4a8dd07c centos:7 "/bin/bash" 3 minutes ago Up 3 minutes mycentos
76f769c39c80 ubuntu:14.04 "/bin/bash" 7 minutes ago Exited (0) 5 minutes ago competent_agnesi
ff63f519b4ac assignment_mock "/bin/sh -c './mock.…" 2 years ago Exited (137) 2 years ago assignment_mock_1
26aba3d2aa65 madup "gunicorn madup.wsgi…" 2 years ago Exited (0) 2 years ago exciting_satoshi
97f4e848c81b postgres:9.6.23 "docker-entrypoint.s…" 2 years ago Up 6 days 0.0.0.0:5433->5432/tcp typeorm-nest-db-1
-a
옵션을 통해 정지된 모든 컨테이너 목록을 확인 가능
2.2.3 컨테이너 삭제
- docker rm 명령으로 컨테이너 삭제 가능
- 복구할 수 없음.
❯ docker rm mycentos ─╯
Error response from daemon: cannot remove container "/mycentos": container is running: stop the container before removing or force remove
- 현재 실행중인 컨테이너는 삭제 불가
❯ docker stop mycentos ─╯
mycentos
❯ docker rm mycentos ─╯
mycentos
❯ docker rm -f mycentos ## 실행 중인 컨테이너를 삭제하는 또 다른 방법 ─╯
Error response from daemon: No such container: mycentos
- 정지 후 삭제
2.2.4 컨테이너를 외부에 노출
- 컨테이너도 가상 머신과 동일하게 IP 주소를 할당 받는다.
❯ docker run -i -t --name network_test ubuntu:14.04 ─╯
root@98759540c29e:/# ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:ac:11:00:02
inet addr:172.17.0.2 Bcast:172.17.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:65535 Metric:1
RX packets:9 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1046 (1.0 KB) TX bytes:0 (0.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
root@98759540c29e:/#
- 새로운 컨테이너 생성 후
ifconfig
로 컨테이너 네트워크 인터페이스 확인 - NAT IP : 172.17.0.2 → eth0 인터페이스
- 로컬 호스트 → lo 인터페이스
- 이 컨테이너는 현재 도커가 설치된 호스트에서만 접근가능하므로, 외부에 컨테이너의 애플리케이션을 노출하기 위해서는 eth0의 IP와 포트를 호스트 IP와 포트에 바인딩해야 함.
❯ docker run -i -t --name mywebserver -p 80:80 ubuntu:14.04 ─╯
root@c943c40ce5a4:/#
-p
옵션을 추가하여 컨테이너의 포트를 호스트의 포트와 바인딩해 연결하도록 설정- [호스트의 포트]:[컨테이너의 포트]
- 위의 예시에서
아파치 웹 서버는 기본적으로 80번 포트를 사용
하므로컨테이너의 80번 포트를 호스트와 연결
한다는 의미이다.
root@c943c40ce5a4:/# apt-get update
root@c943c40ce5a4:/# apt-get install apache2 -y
root@c943c40ce5a4:/# service apache2 start
* Starting web server apache2
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
*
- 해당 80포트 컨테이너 내부에 아파치 웹 서버 설치
- localhost:80 으로 접근한 페이지
- 호스트 IP의 80번 포트로 접근 → 80번 포트는 컨테이너의 80번 포트로 포워딩 → 웹 서버 접근
2.2.5 컨테이너 애플리케이션 구축
- 여러 도커 커뮤니티 뿐만 아니라, 도커 공식 홈페이지에서도 권장하는 구조?
- 데이터베이스와 웹 서버 컨테이너를 구분하도록 하는 구조
- 이렇게 하면 도커 이미지를 관리하고 컴포넌트의 독립성을 유지하기가 쉽다.
❯ docker run -d --name wordpressdb -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=wordpress mysql ─╯
Unable to find image 'mysql:latest' locally
latest: Pulling from library/mysql
c72f53f7235b: Pull complete
c7e4ed755af2: Pull complete
6c8c802f90bc: Pull complete
eecc55f854cd: Pull complete
cc8dabc09813: Pull complete
e376e56dbcf9: Pull complete
bd552de0e856: Pull complete
78c8170ad3df: Pull complete
4936147cb6bb: Pull complete
9445ce8dad71: Pull complete
Digest: sha256:d8df069848906979fd7511db00dc22efeb0a33a990d87c3c6d3fcdafd6fc6123
Status: Downloaded newer image for mysql:latest
e13492929025fdff42fd0b22bd1ee602919c2774df6ff2fa29b76935d535944e
- mysql:5.7 설치 불가로 마지막 버전으로 컨테이너를 설치
❯ docker run -d -e WORDPRESS_DB_HOST=mysql -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=password --name wordpress --link wordpressdb:mysql -
p 80 wordpress
Unable to find image 'wordpress:latest' locally
latest: Pulling from library/wordpress
aa6fbc30c84e: Pull complete
3b0c74a3f697: Pull complete
0538d13b6c86: Pull complete
1e2f923a1b30: Pull complete
19a3613229c8: Pull complete
d02e54bc2f72: Pull complete
e80d480f72e9: Pull complete
d8f3c869558c: Pull complete
ff4ea3838e30: Pull complete
24d8f9892d11: Pull complete
4a42c04a427e: Pull complete
3a99253a31e2: Pull complete
1a7b8c927ff4: Pull complete
62e5a2e7dfd0: Pull complete
b5326d377c9b: Pull complete
6255eef1b603: Pull complete
6747c96b53c9: Pull complete
ff6a87dbe4db: Pull complete
a42fd10cc080: Pull complete
c49ed9170ab5: Pull complete
9cce74b96438: Pull complete
Digest: sha256:c029a137bec0b344fc1ced1980d12a82b93aae9105240afd4e3b1bf83d79a618
Status: Downloaded newer image for wordpress:latest
27b7764b10046001f9e20ad11f3bb122a7df1cd2ec95b70502e06b25ced62848
- 미리 준비된 워드프레스 이미지를 통해 워드프레스 웹 서버 컨테이너 생성
- 호스트의 포트 중 하나와 컨테이너의 80번 포트가 연결된다.
❯ docker ps ─╯
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
27b7764b1004 wordpress "docker-entrypoint.s…" 32 seconds ago Up 31 seconds 0.0.0.0:61058->80/tcp wordpress
e13492929025 mysql "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 3306/tcp, 33060/tcp wordpressdb
- docker ps
❯ docker port wordpress ─╯
80/tcp -> 0.0.0.0:61058
- 호스트와 바인딩 된 포트만 확인
- wordpress 라는 이름의 컨테이너가 사용 중인 호스트의 포트 결과 확인
- 호스트 IP와
61058
번 포트로 워드프레스 웹 서버에 접근이 가능하다.
- http://localhost:61058/ 로 접근한 페이지
-d
: 입출력이 없는 상태(Detached mode)로 컨테이너를 실행. 즉, 컨테이너를 백그라운드에서 동작하는 애플리케이션으로써 실행하도록 설정-i -t
:-d
와는 반대로 컨테이너 내부로 진입하도록 attach 가능한 상태로 설정함. 즉, 하나의 터미널을 차지하는 프로그램이 포그라운드로 실행되어지도록 함.-e
: 컨테이너 내부 환경 변수를 설정한다. 자주 사용하는 옵션 중 하나이다.--link
: A 컨테이너에서 B 컨테이너로 접근하는 방법 중 가장 간단한 NAT로 할당 받은 내부 IP를 쓰는 것. 이 옵션은 내부 IP를 알 필요 없이 항상 컨테이너에 별명으로 접근하도록 설정하는 것을 의미한다.
반응형
'🌈 프로그래밍 > Docker' 카테고리의 다른 글
docker-compose 어느 순간부터 명령어가 안먹는다면? (0) | 2024.11.24 |
---|---|
Docker Volume과 Docker 네트워크의 종류 (0) | 2024.11.23 |
Docker의 개념 (2) | 2024.11.22 |