🌈 프로그래밍/Docker

Docker Engine과 Docker Image의 개념

반응형

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를 알 필요 없이 항상 컨테이너에 별명으로 접근하도록 설정하는 것을 의미한다.
반응형