Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CH2 도커 엔진 (2.1~2.2) #2

Open
KeonHee opened this issue Jul 18, 2021 · 0 comments
Open

CH2 도커 엔진 (2.1~2.2) #2

KeonHee opened this issue Jul 18, 2021 · 0 comments

Comments

@KeonHee
Copy link
Contributor

KeonHee commented Jul 18, 2021

2.1 도커 이미지와 컨테이너

2.1.1 도커 이미지

  • 컨테이너 생성할 떄 필요한 요소
  • 가상머신의 iso 파일과 유사한 개념
  • 여러 개의 계층으로 된 바이너리 파일
  • 컨테이너를 생성하고 실행할 떄 읽기 전용으로 사용
  • 이미지는 도커 명령어로 내려받을 수 있으므로 별도 설치 필요x

image

2.1.2 도커 컨테이너

image

  • 도커 이미지로 컨테이너를 생성
  • 도커 이미지 종류
    • Ubuntu, CentOS, 아파치 웹서버, MySQL, Hadoop, Spark, ....
    • 직접 만들 수도 있음(Dockerfile)
  • 컨테이너를 생성하면 독립적인 공간에 격리된 시스템 자원, 파일 시스템, 네트워크가 생성됨
  • 컨테이너는 이미지를 읽기 전용으로 사용하고 변경된 사항만 컨테이너 계층에 저장해서 실행하기 때문에 컨테이너 변경이 이미지에 영향이 가지 않는다
  • 컨테이터는 독립된 파일시스템을 제공 받기 때문에 특정 컨테이너에서 앱을 설치하고나 삭제해도 다른 컨테이너와 호스트에 영향을 끼치지 않는다

2.2 도커 컨테이너 다루기

2.2.1 컨테이너 생성

  • 도커 엔전 버전 확인
$ docker -v
Docker version 18.09.0, build 4d60db4
  • 컨테이너 생성1
# run: 컨테이너 생성/실행 명령어
# -i: interactive 옵션
# -t: tty(터미널) 옵션
$ docker run -it ubuntu:14.04
  • 컨테이너에서 빠져나오는 방법
  • exit 입력, Ctrl+D: 컨테이너를 종료
  • Ctrl+P,Q: 컨테이너를 정지하지 않음
  • 이미지 목록 출력
$ docker images
  • 컨테이너 생성2
#  create: 컨테이너 생성 명령어
$ docker create -it --name mycentos centos:7

# start: 컨테이너 실행 명령어
$ docker start mycentos

# attach: 컨테이너 내부 접속 명령어
$ docker attach mycentos
  • run, create, run, attach의 차이

스크린샷, 2021-07-18 오후 6 23 17

2.2.2 컨테이너 목록 확인

# Up 상태의 컨테이너만 표시
$ docker ps
CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS              PORTS                                                                    NAMES
f9371741ae0d        ubuntu:16.04                    "/bin/bash"              6 minutes ago       Up 6 minutes
# Created, Exit 상태의 컨테이너까지 표시
$ docker ps -a 
 docker ps -a
CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS                    PORTS                                                                    NAMES
2a81499095aa        ubuntu:16.04                    "/bin/bash"              4 seconds ago       Exited (0) 1 second ago                                                                            myubuntu
5575390265f1        ubuntu:16.04                    "--name myubuntu"        24 seconds ago      Created                                                                                            nostalgic_hofstadter
f9371741ae0d        ubuntu:16.04                    "/bin/bash"              8 minutes ago       Up 8 minute

2.2.3 컨테이너 삭제

  • 컨테이너 삭제 명령어
    • Up상태의 컨테이너는 rm으로 삭제 불가능
    • stop으로 정지 시킨 다음에 rm으로 삭제 해야함
# stop: 컨테이너 정지 명령어
# rm: 컨테이너 삭제 명령어
$ docker stop myubuntu
$ docker rm myubuntu
  • 컨테이너 강제 삭제
    • -f 옵셥으로 Up상태의 컨테이너를 강제로 삭제 가능
$ docker rm -f myubuntu
  • 모든 컨테이너 삭제
$ docker container prune
$ docker rm -f $(docker ps -aq)

2.2.4 컨테이너를 외부에 노출

  • 컨테이너는 가상 IP주소를 할당 받음
  • 172.17.0.x IP를 순차적으로 할당
$ docker ps
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                          NAMES
a1753772e652        ubuntu:14.04        "/bin/bash"         15 seconds ago      Up 14 seconds                           network_test2
  • 컨테이너 내부에서 네트워크 인터페이스 확인
root@8fb1db03d88b:/# 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:1500  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:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          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:1
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
  • 호스트 포트 바인딩
    • 호스트의 80포트와 컨테이너의 80포트를 연결
    • 외부 호스트 80으로 접속하면 컨테이너의 80으로 연결
# -p 내부:외부
$ docker run -it --name network_test3 -p 80:80  ubuntu:14.04

스크린샷, 2021-07-18 오후 6 44 47

2.2.5 컨테이너 애플리케이션 구축

스크린샷, 2021-07-18 오후 6 47 30

- 도커의 철학: 하나의 컨테이너에는 하나의 프로세스만 실행 - 유형2가 더 적절한 구조(컨테이너를 하나더 만들자)
# mysql 실행
$ docker run -d \
--name wordpressdb \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_DATABASE=wordpress \
mysql:5.7

# wordpress 실행
$ docker run -d \
-e WORDPRESS_DB_HOST=mysql \
-e WORDPRESS_DB_USER=root \
-e WORDPRESS_DB_PAWSSWORD=password \
--name wordpress \
--link wordpressdb:mysql \
-p 80 \
wordpress

2.2.6 도커 볼륨

  • 도커 이미지로 컨테이너를 생성하면 이미지는 읽기 전용
  • 이미 생성된 이미지는 변경되지 않음
  • 컨테이너 레이어에 컨테이너서 변경된 파일시스템등을 저장

스크린샷, 2021-07-18 오후 6 54 27

- 위 그림에서 mysql 컨테이너를 삭제하면 mysql 에서 저장된 파일 정보들이 모두 삭제됨 -> 볼륨 매핑으로 해결

1. 호스트와 볼륨 공유 (가장 많이 사용)

$ docker run -d \
--name wordpressdb \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_DATABASE=wordpress \
-v /home/wordpress_db:/var/lib/mysql \
mysql:5.7
  • 호스트의 /home/wordpress_db와 컨테이너의 /var/lib/mysql 볼륨 공유
  • 컨테이너 내부에서 /var/lib/mysql에 데이터를 쓰면 호스트의 /home/wordpress_db에서도 확인 가능
  • 컨테이너를 삭제해도 호스트의 /home/wordpress_db에 mysql 파일 정보들이 남아있음

스크린샷, 2021-07-18 오후 7 01 25

스크린샷, 2021-07-18 오후 7 02 05

2. 볼륨 컨테이너

  • -v 옵션으로 볼륨을 사용한 컨테이너를 다른 컨테이너와 공유
$ docker run -it \
--name volumes_from_container \
--volumes-from volume_overide \
ubuntu:14.04

스크린샷, 2021-07-18 오후 7 04 17

3. 도커 볼륨

  • 볼륨 생성
$ docker volume create --name myvolume

$ docker volume ls
  • 볼륨 사용
docker run -it  \
--name myvolume \
-v myvoulume:/root/ \
ubuntu:14.04

스크린샷, 2021-07-18 오후 7 06 58

$ docker inspect --type volume myvolume
  • 볼륨 자동 생성하면서 컨테이너 실행
docker run -it  \
--name myvolume \
-v /root/ \
ubuntu:14.04

2.2.7 도커 네트워크

1. 도커 네트워크 구조

  • 컨테이너 내부에 eth0, lo0 네트워크 인터페이스 생성
root@8fb1db03d88b:/# 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:1500  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:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          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:1
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
  • 컨테이너 내부의 eth0와 연결된 veth가 호스트 네트워크 인터페이스로 생성되면서 외부에서 접근할 수 있음
  • veth은 도커에서 자동으로 생성
  • 호스트의 네트워크 인터페이스 확인
[root@test-bmt2-controller001-ncl ~]# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:69:50:58:54  txqueuelen 0  (Ethernet)
        RX packets 3048565172  bytes 987713088651 (919.8 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 3683268937  bytes 897484235252 (835.8 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.106.231.230  netmask 255.255.254.0  broadcast 10.106.231.255
        ether c2:b4:04:d0:d7:48  txqueuelen 1000  (Ethernet)
        RX packets 5072239702  bytes 864208915828 (804.8 GiB)
        RX errors 2  dropped 0  overruns 0  frame 0
        TX packets 2990207135  bytes 988583888084 (920.6 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1  (Local Loopback)
        RX packets 14731  bytes 4208663 (4.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 14731  bytes 4208663 (4.0 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

veth46566c8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether fa:76:6b:dd:75:4b  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

스크린샷, 2021-07-18 오후 7 15 02

2. 도커 네트워크 기능

  • docker0 브리지를 통해 외부와 통신할 수 있는 환경 제공
  • 사용자의 선택에 따라 여러 네트워크 드라이브 사용 가능
    • bridge, host none, container, overlay
    • 3rd-party: weave, flannel, openswitch, ...

브리지 네트워크

$  docker network inspect bridge
[
    {
        "Name": "bridge",
...
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
...
  • "Subnet": "172.17.0.0/16": 172.17.0.x IP대역을 컨테이너에 순차적으로 할당

호스트 네트워크

  • 호스트의 네트워크 환경을 그대로 사용
docker run -it --name network_host --net host ubuntu:14.04
root@test-bmt2-controller001-ncl:/# ifconfig
docker0   Link encap:Ethernet  HWaddr 02:42:69:50:58:54
          inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:3048565172 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3683268937 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:987713088651 (987.7 GB)  TX bytes:897484235252 (897.4 GB)

eth0      Link encap:Ethernet  HWaddr c2:b4:04:d0:d7:48
          inet addr:10.106.231.230  Bcast:10.106.231.255  Mask:255.255.254.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:5072331854 errors:2 dropped:0 overruns:0 frame:0
          TX packets:2990209740 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:864213393971 (864.2 GB)  TX bytes:988585580770 (988.5 GB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:14731 errors:0 dropped:0 overruns:0 frame:0
          TX packets:14731 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:4208663 (4.2 MB)  TX bytes:4208663 (4.2 MB)

논 네트워크

  • 네트워크 사용x
docker run -it --name network_none --net none ubuntu:14.04

root@6e0f4f2041d7:/# ifconfig
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          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:1
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

MacVLAN 네트워크

  • 호스트의 네트워크 인터페이스 카드를 가상화해 물리 네트워크 환경을 컨테이너에게 제공
  • 컨테이너는 물리 네트워크상에서 가상의 맥(MAC) 주소를 가지며, 해당 네트워크에 연결된 다른 장치와 통신이 가능
  • 172.17.x.x 대신에 네트워크 장비의 IP를 할당 받음

스크린샷, 2021-07-18 오후 7 42 38

- MacVLAN을 사용하는 컨테이너와 호스트는 통신 불가, 컨테이너A와 서버2는 통신이 가능하지만 서버1은 통신 불가 - MacVLAN을 사용하려면 적어도 1개의 네트워크 장비와 서버가 필요
@KeonHee KeonHee changed the title CH2 도커 엔진 (2.1~2.3) CH2 도커 엔진 (2.1~2.2) Jul 18, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants