Last Updated on 9월 14, 2021 by Jade(정현호)
안녕하세요
이번 포스팅에서는 도커 컨테이너 사용에 관한 관리, 브릿지 네트워크 설정, Volume, 도커 이미지 생성 등을 확인 해보도록 하겠습니다.
아래 포스팅에서 이어지는 글입니다.
1. Docker 네트워크
먼저 포스팅에서 사용할 도커 이미지를 다운로드 받겠습니다.
Docker Search / Pull
기본적으로는 Public Registry(hub.docker.com) 에서 검색과 다운로드를 받게 됩니다.
먼저 도커 이미지를 검색하기 위해서는 search 명령어를 사용하면 되며, 테스트를 위해서 도커 이미지를 다운로드 받겠습니다.
-- 현재 상태 : 이미지 없음 [devops@docker1 ~]$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE [devops@docker1 ~]$ -- 이미지 조회 [devops@docker1 ~]$ docker search httpd NAME DESCRIPTION STARS OFFICIAL AUTOMATED httpd The Apache HTTP Server Project 3559 [OK] centos/httpd-24-centos7 Platform for running Apache httpd 2.4 or bui… 40 centos/httpd 34 [OK] polinux/httpd-php Apache with PHP in Docker (Supervisor, CentO… 5 [OK] solsson/httpd-openidc mod_auth_openidc on official httpd image, ve… 2 [OK] hypoport/httpd-cgi httpd-cgi 2 [OK] salim1983hoop/httpd24 Dockerfile running apache config 2 [OK] dariko/httpd-rproxy-ldap Apache httpd reverse proxy with LDAP authent… 1 [OK] manageiq/httpd Container with httpd, built on CentOS for Ma… 1 [OK] publici/httpd httpd:latest 1 [OK] dockerpinata/httpd 1 lead4good/httpd-fpm httpd server which connects via fcgi proxy h… 1 [OK] clearlinux/httpd httpd HyperText Transfer Protocol (HTTP) ser… 1 inanimate/httpd-ssl A play container with httpd, ssl enabled, an… 1 [OK] jonathanheilmann/httpd-alpine-rewrite httpd:alpine with enabled mod_rewrite 1 [OK] centos/httpd-24-centos8 1 appertly/httpd Customized Apache HTTPD that uses a PHP-FPM … 0 [OK] amd64/httpd The Apache HTTP Server Project 0 interlutions/httpd httpd docker image with debian-based config … 0 [OK] e2eteam/httpd 0 manasip/httpd 0 trollin/httpd 0 ysli/httpd Httpd for DeepWeb 0 [OK] manageiq/httpd_configmap_generator Httpd Configmap Generator 0 [OK] itsziget/httpd24 Extended HTTPD Docker image based on the off… 0 [OK] -- 이미지 다운로드 [devops@docker1 ~]$ docker pull httpd:2.4 2.4: Pulling from library/httpd b4d181a07f80: Downloading [======================> ] 12MB/27.15MB 4b72f5187e6e: Download complete 12b2c44d04b2: Download complete ef481fc2a03a: Downloading [==========================================> ] 20.8MB/24.58MB d483d945fcab: Download complete -- 다운로드 받은 이미지 조회 [devops@docker1 ~]$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE httpd 2.4 30287d899656 4 days ago 138MB
포트포워딩 설정
일반적인 docker run(or run -d) 으로 실행하였을 경우 호스트 OS 에서는 접속이 되지만 그외 PC나 서버와 같은 외부에서는 접속이 되지 않습니다.
실행하려는 컨테이너 애플리케이션이 서버 역활로 외부에서 접속을 받는 애플리케이션 형태라면 외부에서 접속이 가능하도록 포트포워딩을 기능을 통해 컨테이너 실행을 해야 합니다.
컨테이너를 실행시에 -p 옵션을 사용하면 되며, 외부에서 접속을 할 포트를 지정하여 기동하거나 생략하고 실행하면 됩니다. 외부에서 접속할 포트를 생략하면 포트는 랜덤 하게 지정 됩니다
그리고 외부에서 접속할 포트는 가급적 well-known port 가 아닌 1025 이상으로 지정하여 오픈 하는 것이 좋습니다.
사용 옵션은 아래와 같이 사용 되며 실제 실행은 다음 과 같습니다.
• 옵션: -p 외부사용_Port:컨테이너_Port
-- [외부사용_포트:컨테이너_포트] [devops@docker1 ~]$ docker run -d --name apache-1 -p 1025:80 httpd:2.4 456bff89f1f26db8e3d3fe074261ae968281fc6d5148efd4b9b9053f4cdf84fd [devops@docker1 ~]$ docker run -d --name apache-2 -p :80 httpd:2.4 a7095d661fd9b818d9c5a7204f316b08fa2df9b5eb205eb74abd1a0dd46afdad [devops@docker1 ~]$ docker run -d --name apache-3 -p 80 httpd:2.4 ae861ec03652d7b3c5f5fe9ccd294fdd6171eb15421ecf65fc73e2c4ab78660a [devops@docker1 ~]$ docker run -d --name apache-4 -p 1026:85 httpd:2.4 3205fa2fa2eaf844e94a5b37d8d93715726c45f15521d9bc80535d2832410b2e [devops@docker1 ~]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3205fa2fa2ea httpd:2.4 "httpd-foreground" 2 minutes ago Up 2 minutes 80/tcp, 0.0.0.0:1026->85/tcp, :::1026->85/tcp apache-4 ae861ec03652 httpd:2.4 "httpd-foreground" 3 minutes ago Up 3 minutes 0.0.0.0:49157->80/tcp, :::49157->80/tcp apache-3 a7095d661fd9 httpd:2.4 "httpd-foreground" 3 minutes ago Up 3 minutes 0.0.0.0:49156->80/tcp, :::49156->80/tcp apache-2 456bff89f1f2 httpd:2.4 "httpd-foreground" 3 minutes ago Up 3 minutes 0.0.0.0:1025->80/tcp, :::1025->80/tcp apache-1
4개의 컨테이너를 1,2,3,4 넘버링을 하여 실행하였습니다. 각 컨테이너 별 차이를 살펴보도록 하겠습니다. 그리고 접속한 사이트가 접속을 의도한 컨테이너가 맞는지 확인 차원에서 식별 문구를 컨테이너 별로 추가하도록 하겠습니다. exec 옵션을 활용하여 아래와 같이 사용할 수 있습니다.
docker exec apache-1 /bin/bash -c "echo 'Container apache-1' \ >> /usr/local/apache2/htdocs/index.html" docker exec apache-2 /bin/bash -c "echo 'Container apache-2' \ >> /usr/local/apache2/htdocs/index.html" docker exec apache-3 /bin/bash -c "echo 'Container apache-3' \ >> /usr/local/apache2/htdocs/index.html" docker exec apache-4 /bin/bash -c "echo 'Container apache-4' \ >> /usr/local/apache2/htdocs/index.html"
먼저 apache-1 은 가장 일반 적인 방법으로 외부 접속 포트 1025로 지정하였으며 컨테이너로 전달될 포트는 80으로 지정하였습니다. 외부에서 1025 포트로 접속하면 아래와 같이 컨테이너 apache-1 로 접속이 된 것을 확인 할 수 있습니다.
그 다음 apache-2 와 apache-3 는 외부 포트를 확인 해봐야 하며 ps 로 조회하여 확인 할 수 있습니다.
[devops@docker1 ~]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3205fa2fa2ea httpd:2.4 "httpd-foreground" 34 minutes ago Up 34 minutes 80/tcp, 0.0.0.0:1026->85/tcp, :::1026->85/tcp apache-4 ae861ec03652 httpd:2.4 "httpd-foreground" 35 minutes ago Up 35 minutes 0.0.0.0:49157->80/tcp, :::49157->80/tcp apache-3 a7095d661fd9 httpd:2.4 "httpd-foreground" 35 minutes ago Up 35 minutes 0.0.0.0:49156->80/tcp, :::49156->80/tcp apache-2 456bff89f1f2 httpd:2.4 "httpd-foreground" 35 minutes ago Up 35 minutes 0.0.0.0:1025->80/tcp, :::1025->80/tcp apache-1
apache-2 컨테이너는 49156 포트 로 확인되며, apache-3 컨테이너는 49157 포트로 확인 됩니다 접속을 하면 아래와 같이 정상적으로 접속이 되는 것을 확인할 수 있습니다.
• apache-2 접속 화면
• apache-3 접속 화면
apache-2 와 3의 차이는 실행시 -p :80 httpd:2.4 와 -p 80 httpd:2.4 로 실행하였으며 차이의 유무를 확인하고자 진행하였으며 -p :80 과 -p 80 은 같은 의미로 실행됨을 알 수 있습니다.
이제 그 다음 apache-4 컨테이너는 -p 1026:85 옵션을 사용하여 실행하였습니다. 1026포트로 접속을 해보면 아래와 같이 접속이 되지 않는 다는 것을 알 수 있습니다.
접속이 안되는 이유는 아래와 같이 되어 있기 때문 입니다.
-- docker ps 정보 80/tcp, 0.0.0.0:1026->85/tcp, :::1026->85/tcp
docker container 는 지정된 포트, 여기에서는 80번포트로 실행중이지만, 포트포워딩은 그것과 무관하게 1026번 포트에서 -> 85번 포트로 지정하였기 때문에 접속이 안되었던 것 입니다.
docker -p 를 사용하여 설정하는 포트포워딩은 말 그대로 지정한 포트에서 포트로 패킷을 전달해주는 역할입니다. -p 에서 포트를 지정한다고 컨테이너가 실행되면서 그 포트로 기동되지는 않습니다.
그러므로 컨테이너에서 설정된 포트로 지정을 해야 합니다 대부분 컨테이너 이미지에 정보에서 포트 정보를 확인 할 수 있으며 inspect 옵션을 사용하면 됩니다.
[devops@docker1 ~]$ docker inspect -f "{{ .ContainerConfig.ExposedPorts }}" 30287d899656 map[80/tcp:{}] <-- 80 번 포트
네트워크 종류
위에서는 -p 를 통해 포트포워딩을 설정하여 외부의 접속을 확인해보았습니다. 그럼 도커에서는 어떠한 형태의 네트워크로 구성되어 있으며 추가적으로 설정 가능한 네트워크에 관련하여 확인 해보도록 하겠습니다.
docker 에서 네트워크 관련된 조작 및 조회 등은 docker network 를 사용 합니다.
-- 설정된 네트워크 현황 조회 [devops@docker1 ~]$ docker network ls NETWORK ID NAME DRIVER SCOPE f1b9771ef459 bridge bridge local 30c9b4e92b07 host host local 2d241f868b3a none null local -- 명령어 자동 완성인 bash-completion 를 사용하여 가능한 종류 조회 [devops@docker1 ~]$ docker network create --driver bridge ipvlan macvlan overlay <-----
• bridge
먼저 bridge 에 대해서 확인해보도록 하겠습니다 bridge 네트워크는 도커의 컨테이너가 사용하는 네트워크 방식 중 기본 또는 default 네트워크 종류 입니다.
아래와 같이 호스트OS 와 컨테이너가 사용중인 bridge 유형의 네트워크를 통해 통신이 가능하고 또한 컨테이너 간에도 통신이 가능 합니다. 컨테이너의 특징 중 하나인 격리화에 의해 각 컨테이너는 독립적이면서 다른 컨테이너에게 영향을 주지 않는 격리화가 되어 있지만 네트워크 상에서는 통신이 가능 합니다.
[docker.com/blog/understanding-docker-networking-drivers-use-cases]
위의 이미지와 같이 컨테이너 간의 연결성이 필요한 경우 Web 과 DB 또는 Web Server 와 Middleware(예 Tomcat) 연동을 해야 할 경우도 있습니다. 그래서 각 컨테이너 마다 격리화는 되어있지만 도커에서 제공되는 네트워크를 통해서 서로 통신이 가능하게 됩니다. 물론 통신이 안되게 할 수도 있습니다.
컨테이너 간의 통신의 가능 여부 테스트는 간단하게 컨테이너에서 다른 컨테이너로의 접속을 통해 확인 할 수 있습니다.
-- 컨테이너에 진입 [devops@docker1 ~]$ docker exec -it apache-1 /bin/bash -- root@456bff89f1f2:/usr/local/apache2# apt update Get:1 http://deb.debian.org/debian buster InRelease [122 kB] Get:2 http://security.debian.org/debian-security buster/updates InRelease [65.4 kB] Get:3 http://deb.debian.org/debian buster-updates InRelease [51.9 kB] <...중략...> root@456bff89f1f2:/usr/local/apache2# apt install -y curl Reading package lists... Done Building dependency tree <...중략...> Unpacking curl (7.64.0-4+deb10u2) ... Setting up curl (7.64.0-4+deb10u2) ... -- 2번째 apache 컨테이너에 접속을 하였음 root@456bff89f1f2:/usr/local/apache2# curl http://172.17.0.3 <html><body><h1>It works!</h1></body></html> Container apache-2
기본적으로 모든 컨테이너는 172.17.x.x (B class / 16) 대역대로 IP 를 부여 받고 브릿지 네트워크 모드로 사용하기 때문에 위와 같이 컨테이너 별로의 통신이 가능 한 상태 입니다.
또는 별도의 bridge 네트워크를 생성하여 대역대를 분리하여 컨테이너 별로 네트워크에 차원의 격리도 할 수 있습니다. mybridge1 와 mybridge2 로 생성을 해보도록 하겠습니다.
-- 시작 전 상태 조회 [devops@docker1 ~]$ docker network ls NETWORK ID NAME DRIVER SCOPE f1b9771ef459 bridge bridge local 30c9b4e92b07 host host local 2d241f868b3a none null local -- subnet 을 지정해서 bridge 신규 생성 [devops@docker1 ~]$ docker network create --driver bridge mybridge1 \ --subnet 172.20.0.0/16 --ip-range 172.20.0.0/24 --gateway 172.20.0.1 aef63608efe330518f461e4fb6c535da43f7b48781e8a44f566074abc474ae3a -- subnet 을 지정해서 bridge 신규 생성 [devops@docker1 ~]$ docker network create --driver bridge mybridge2 \ --subnet 172.30.0.0/16 --ip-range 172.30.0.0/24 --gateway 172.30.0.1 186c69969ea9242cd48a73179c08d5fbdb0f72cfaacd59202051444b75cac9da [devops@docker1 ~]$ docker network ls NETWORK ID NAME DRIVER SCOPE f1b9771ef459 bridge bridge local 30c9b4e92b07 host host local aef63608efe3 mybridge1 bridge local <--- 186c69969ea9 mybridge2 bridge local <--- 2d241f868b3a none null local -- ifconfig 조회 [devops@docker1 ~]$ ifconfig | grep br- br-186c69969ea9: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 br-aef63608efe3: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 [devops@docker1 ~]$ ifconfig br-186c69969ea9 br-186c69969ea9: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 172.30.0.1 <--- netmask 255.255.0.0 broadcast 172.30.255.255 ether 02:42:cf:e2:9a:d9 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 [devops@docker1 ~]$ ifconfig br-aef63608efe3 br-aef63608efe3: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 172.20.0.1 <--- netmask 255.255.0.0 broadcast 172.20.255.255 ether 02:42:42:48:de:7a 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
이와 같이 다른 대역대의 bridge 네트워크를 2개 생성하였습니다. 생성한 네트워크를 통해서 컨테이너를 시작 하도록 하겠습니다.
-- network 속성을 사용하여 컨테이너 시작시작 [devops@docker1 ~]$ docker run -d --network mybridge1 --name apache-5 httpd:2.4 3a2834bf9a0a03354d9f8b2e03af5297ba810272a08a659e7a0a66cea08bab75 -- network 속성을 사용하여 컨테이너 시작시작 [devops@docker1 ~]$ docker run -d --network mybridge2 --name apache-6 httpd:2.4 0f80d51d8125aa0756949c960ff65cb9ccf5d87c36e5b9969a73720d909a4374 [devops@docker1 ~]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0f80d51d8125 httpd:2.4 "httpd-foreground" 9 seconds ago Up 8 seconds 80/tcp apache-6 3a2834bf9a0a httpd:2.4 "httpd-foreground" 17 seconds ago Up 16 seconds 80/tcp apache-5 -- IP 속성 확인 [devops@docker1 ~]$ docker inspect apache-5 <...중략...> "Networks": { "mybridge1": { "IPAMConfig": null, "Links": null, "Aliases": [ "3a2834bf9a0a" ], "NetworkID": "aef63608efe330518f461e4fb6c535da43f7b48781e8a44f566074abc474ae3a", "EndpointID": "7c867d7a2690422a0f165d19ae1f476afd18527f3fefe3040e86db6747301de6", "Gateway": "172.20.0.1", "IPAddress": "172.20.0.2", <----- "IPPrefixLen": 16, "IPv6Gateway": "", <...중략...> [devops@docker1 ~]$ docker inspect apache-6 <...중략...> "Networks": { "mybridge2": { "IPAMConfig": null, "Links": null, "Aliases": [ "0f80d51d8125" ], "NetworkID": "186c69969ea9242cd48a73179c08d5fbdb0f72cfaacd59202051444b75cac9da", "EndpointID": "ecfc5d982c185e079abc9f720c94ac3225fcd6d6e1e11afb9ace95cd8bcfd588", "Gateway": "172.30.0.1", "IPAddress": "172.30.0.2", "IPPrefixLen": 16, "IPv6Gateway": "", <...중략...>
생성한 bridge 네트워크 대역대로 컨테이너가 시작 된 것을 알 수 있으며 gateway IP 그 다음 번 IP 인 0.2 로 시작 한 것을 알 수 있습니다.
그럼 기존의 default bridge 네트워크를 사용하여 시작된 컨테이너와 통신이 가능한지를 테스트를 진행 하겠습니다.
[devops@docker1 ~]$ docker exec -it apache-1 /bin/bash -- 접속 불가 root@456bff89f1f2:/usr/local/apache2# curl http://172.20.0.2 curl: (7) Failed to connect to 172.20.0.2 port 80: Connection timed out -- 접속 불가 root@456bff89f1f2:/usr/local/apache2# curl http://172.30.0.2 curl: (7) Failed to connect to 172.30.0.2 port 80: Connection timed out
이와 같이 bridge 네트워크를 분리하면 원하는 형태로 컨테이너의 네트워크 격리화 등을 구성할 수 있습니다. 삭제는 network rm Container_ID 로 진행 할 수 있으며 해당 네트워크를 컨테이너에서 사용 중이라면 삭제 할 수 없습니다. 컨테이너 먼저 중지 후 네트워크를 삭제 해야 합니다.
-- 에러 발생 [devops@docker1 ~]$ docker network rm aef63608efe3 Error response from daemon: error while removing network: network mybridge1 id xxxxx has active endpoints -- 컨테이너 종료 [devops@docker1 ~]$ docker stop apache-5 apache-5 [devops@docker1 ~]$ docker stop apache-6 apache-6 [devops@docker1 ~]$ docker network ls NETWORK ID NAME DRIVER SCOPE f1b9771ef459 bridge bridge local 30c9b4e92b07 host host local aef63608efe3 mybridge1 bridge local 186c69969ea9 mybridge2 bridge local 2d241f868b3a none null local -- 네트워크 제거 [devops@docker1 ~]$ docker network rm aef63608efe3 aef63608efe3 -- 네트워크 제거 [devops@docker1 ~]$ docker network rm mybridge2 mybridge2 [devops@docker1 ~]$ docker network ls NETWORK ID NAME DRIVER SCOPE f1b9771ef459 bridge bridge local 30c9b4e92b07 host host local 2d241f868b3a none null local
• macvlan
macvlan 는 하나의 네트워크 인터페이스를 여러개의 별도의 Mac 주소를 가지는 네트워크 인터페이스로 분리하여 사용할 수 있는 네트워크 기술 입니다.
Child interface 는 각각 별도의 Mac Address 와 macvlan mode 를 가질수 있는 특징이 있으며 Mode에 따라서 전송정책을 달리 합니다.
docker 자체 기능은 아니고 리눅스에서 구현 되어있는 네트워크 기능 입니다
macvlan 에서 사용 할 수 있는 세부 모드는 아래와 같이 4가지 있습니다.
- Private Mode
- VEPA (Virtual Ethernet Port Aggregator)
- Bridge Mode
- Passthru Mode
4가지가 있지만 Docker 에서는 Bridge Mode 만 사용 할 수 있습니다.
[ssup2.github.io/Linux_macvlan_macvtap]
Mode에 관계없이 Parent Interface와 Child Interface는 서로 절대로 통신이 불가능한게 macvlan의 특징 이며 Linux Bridge와 동일한 동작을 수행하는 Mode이기 때문에 Linux Bridge를 대체하는 용도로 많이 이용 됩니다.
네트워크 생성
먼저 사용 할 네트워크 인터페이스는 promisc 모드 설정이 필요 합니다.
-- promiscuous 설정 [devops@docker1 ~]$ sudo ip link set dev enp0s8 promisc on
재부팅시에도 적용을 위해서는 아래의 내용으로 서비스를 생성하면 됩니다.
-- promisc.service 파일에 아래 내용을 입력 ~]$ sudo vi /etc/systemd/system/promisc.service [Unit] Description=Bring up an interface in promiscuous mode during boot After=network.target [Service] Type=oneshot ExecStart=/sbin/ip link set dev enp0s8 promisc on TimeoutStartSec=0 RemainAfterExit=yes [Install] WantedBy=default.target -- reload 및 서비스 활성사 수행 ~]$ sudo systemctl daemon-reload ~]$ sudo enable promisc.service ~]$ sudo start promisc.service
테스트를 위해서 네트워크를 생성 하도록 하겠습니다
-- macvlan_1 으로 네트워크 생성 [devops@docker1 ~]$ docker network create -d macvlan \ --gateway=192.168.56.1 \ --subnet=192.168.56.0/24 \ --ip-range=192.168.56.0/24 \ -o macvlan_mode=bridge \ -o parent=enp0s8 macvlan_1 [devops@docker1 ~]$ docker network ls NETWORK ID NAME DRIVER SCOPE b4c39a160fb9 bridge bridge local 30c9b4e92b07 host host local 4c887e3d9e35 macvlan_1 macvlan local <--- 2d241f868b3a none null local
컨테이너 실행
먼저 기본 네트워크인 bridge network 로 생성을 한 후, 테스트를 위한 패키지 설치 후 네트워크를 macvlan 으로 변경 하도록 하겠으며, 그 다음 두 번째 컨테이너를 실행하겠습니다.
-- 첫번째 컨테이너 실행 -- 패키지 다운을 위해 먼저 기본 네트워크로 실행하였음 [devops@docker1 ~]$ docker run -d --name httpd1-macv-1 httpd:2.4 -- 테스트를 위해 패키지 설치 root@2faa0aa152a3:/# apt update root@2faa0aa152a3:/# apt install iputils-ping curl telnet iproute2 root@2faa0aa152a3:/# exit -- 컨테이너에 macvlan 연결 및 bridge 네트워크를 disconenct [devops@docker1 ~]$ docker network connect macvlan_1 httpd1-macv-1 [devops@docker1 ~]$ docker network disconnect bridge httpd1-macv-1 [devops@docker1 ~]$ docker inspect httpd1-macv-1 <... 중략 ...> "Gateway": "192.168.56.1", "IPAddress": "192.168.56.2", "IPPrefixLen": 24, -- 두번째 컨테이너 실행 [devops@docker1 ~]$ docker run -d --name httpd2-macv-1 \ --ip 192.168.56.3 \ --net=macvlan_1 httpd:2.4 [devops@docker1 ~]$ docker exec httpd2-macv-1 /bin/bash -c "echo 'macvlan httpd 2' \ >> /usr/local/apache2/htdocs/index.html"
접속 테스트
macvlan은 같은 네트워크 디바스에 해당하는 Child interface 간에는 통신이 가능 합니다. 컨테이너 간의 접속 가능 여부를 확인 해보도록 하겠습니다.
-- 첫번째 컨테이너로 진입 [devops@docker1 ~]$ docker exec -it httpd2-macv-1 /bin/bash -- 두번째 컨테이너로 ping 테스트 -- 192.168.56.2 -> 192.168.56.3 root@2faa0aa152a3:/# ping -c 3 192.168.56.3 PING 192.168.56.3 (192.168.56.3) 56(84) bytes of data. 64 bytes from 192.168.56.3: icmp_seq=1 ttl=64 time=0.028 ms 64 bytes from 192.168.56.3: icmp_seq=2 ttl=64 time=0.094 ms 64 bytes from 192.168.56.3: icmp_seq=3 ttl=64 time=0.035 ms -- 두번째 컨테이너로 http 접속 가능 확인 -- 192.168.56.2 -> 192.168.56.3 root@2faa0aa152a3:/# curl http://192.168.56.3 <html><body><h1>It works!</h1></body></html> macvlan httpd 2 <--- 문구도 확인됨
• ipvlan
VM 에서 사용되는 브릿지모드 표현은 Guest OS 가 Nat 나 별도의 가상IP를 할당 받는 것이 아닌 Host OS 와 같은 IP를 할당 받는 것을 의미 합니다. 가령 Host가 공유기에 연결되어 있고 가상 VM의 네트워크가 브릿지 모드 라면 공유기의 IP가 Guest OS에서도 할당을 받게 되는 것이지요
[https://docs.docker.com/network/ipvlan]
도커의 브릿지 네트워크는 외부에서 접속시 포트포워딩이 설정이 되어 있어야 하기 때문에 어떻게 보면 VM에서 Nat 로 볼수도 있습니다. 정리해서 iplvlan 는 브릿지 모드 와 같이 Host OS 대역대 IP를 할당 받는 유형 입니다.
ipvlan 을 사용하기 위해서는 Kernel 4.2 이상이 필요하지만 CentOS7은 3.10 버전대라서 해당 테스트에서는 CentOS 8.3 에서 진행하였습니다.
• [참고] CentOS7 에서 ipvlan 생성시 에러
Error response from daemon: kernel version failed to meet the minimum ipvlan kernel requirement of 4.2, found 3.10.0
• [참고] 같은 네트워크 인터페이스 지정시
예를 들어 eth0 디바이스에 macvlan 과 ipvlan 을 동시에 설정할 경우 아래와 같은 에러가 발생될 수 있습니다. 그러므로 1개 네트워크 디바이스에는 1개의 docker 네트워크를 생성 해야 합니다.
Error response from daemon: failed to allocate gateway (192.168.56.1): Address already in use
또는
docker: Error response from daemon: failed to create the ipvlan port: device or resource busy
처음에는 2개의 서버에서 네트워크 생성 및 컨테이너 실행을 하여 테스트를 진행하려고 합니다.
네트워크 생성
먼저 첫번째 서버(호스트명 test1) 에서 ipvlan 네트워크 생성을 합니다
[test@test1 ~]$ docker network create --driver ipvlan \ --subnet=192.168.56.0/24 --gateway=192.168.56.1 \ -o parent=enp0s8 \ -o ipvlan_mode=l2 \ ipvlan_1 [test@test1 ~]$ docker network ls NETWORK ID NAME DRIVER SCOPE 97c59e3cee0e bridge bridge local 96b5b02f5b6b host host local 38f40d7f4d7e ipvlan_1 ipvlan local 9b513b87f4aa none null local
parent 에는 같은 IP 대역대를 사용하는 호스트OS의 Network Device 명을 입력 하면 되며, ipvlan_mode 는 생략시 기본 l2 모드로 생성이 됩니다.
그 다음 두번째(호스트명 test2) 에서 ipvlan 네트워크를 생성 합니다.
-- 두번째 서버에서 네트워크 생성 [test@test2 ~]$ docker network create --driver ipvlan \ --subnet=192.168.56.0/24 --gateway=192.168.56.1 \ -o parent=enp0s8 -o \ ipvlan_mode=l2 \ ipvlan_2 [test@test2 ~]$ docker network ls NETWORK ID NAME DRIVER SCOPE 61981b2bf928 bridge bridge local 48af0015cb0f host host local e815659420b8 ipvlan_2 ipvlan local <--- 425c33e13f62 none null local
컨테이너 실행
위에서 생성한 네트워크를 지정하여 컨테이너를 실행 하도록 하겠습니다.
-- centos 이미지 다운로드 [test@test1 ~]$ docker pull centos:7 -- ipvlan_1 를 지정하여 컨테이너 실행 [test@test1 ~]$ docker run -d --name centos-ipv-1 \ --net=ipvlan_1 \ centos:7 /sbin/init [test@test1 ~]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0f78229dcde1 centos:7 "/sbin/init" 6 seconds ago Up 5 seconds centos-ipv-1 [test@test1 ~]$ docker inspect centos-ipv-1 <...중략...> "Gateway": "192.168.56.1", "IPAddress": "192.168.56.2", "IPPrefixLen": 24, "IPv6Gateway": "", "GlobalIPv6Address": "", <...중략...> -- 두번째 서버에서 ipvlan_2 지징하여 컨테이너 실행 [test@test2 ~]$ docker run -d --name centos-ipv-2 \ --net=ipvlan_2 --ip 192.168.56.3 \ centos:7 /sbin/init [test@test2 ~]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 391ef89d6b45 centos:7 "/sbin/init" 6 seconds ago Up 5 seconds centos-ipv-2 [test@test2 ~]$ docker inspect centos-ipv-2 <...중략...> "Gateway": "192.168.56.1", "IPAddress": "192.168.56.3", "IPPrefixLen": 24, "IPv6Gateway": "", <...중략...>
ping 가능 테스트
위에서 생성한 컨테이너 와 호스트를 변경하여 통신이 가능한지를 확인 해보도록 하겠습니다.
-- 호스트1에서 centos-ipv-1 컨테이너로 ping 시도 -- ping 불가함 [test@test1 ~]$ ping 192.168.56.2 PING 192.168.56.2 (192.168.56.2) 56(84) bytes of data. From 192.168.56.95 icmp_seq=1 Destination Host Unreachable From 192.168.56.95 icmp_seq=2 Destination Host Unreachable -- 호스트2에서 centos-ipv-1 컨테이너로 ping 시도 -- ping 불가함 [test@test2 ~]$ ping 192.168.56.3 PING 192.168.56.3 (192.168.56.3) 56(84) bytes of data. From 192.168.56.111 icmp_seq=1 Destination Host Unreachable From 192.168.56.111 icmp_seq=1 Destination Host Unreachable 호스트 1 -> 호스트 2의 Container 로 통신 가능 [test@test1 ~]$ ping 192.168.56.3 PING 192.168.56.3 (192.168.56.3) 56(84) bytes of data. 64 bytes from 192.168.56.3: icmp_seq=1 ttl=64 time=0.706 ms 64 bytes from 192.168.56.3: icmp_seq=2 ttl=64 time=0.430 ms 호스트 2 -> 호스트 1의 Container 로 통신 가능 [test@test2 ~]$ ping 192.168.56.2 PING 192.168.56.2 (192.168.56.2) 56(84) bytes of data. 64 bytes from 192.168.56.2: icmp_seq=1 ttl=64 time=0.941 ms 64 bytes from 192.168.56.2: icmp_seq=2 ttl=64 time=0.315 ms
호스트 OS에서 기동중인 컨테이너와 해당 호스트 OS 간에는 macvlan 처럼 통신이 불가능 하였습니다. 다만 다른 호스트의 컨테이너 와 통신은 가능 하였습니다.
추가 컨테이너 실행 및 테스트
첫번째 호스트에서 apache 컨테이너를 시작하여 외부 및 다른 호스트, 다른 컨테이너에서 http 80 포트 접속 여부도 확인 해보도록 하겠습니다.
-- 첫번째 호스트 에서 apache 컨테이너 실행 [test@test1 ~]$ docker run -d --name myhttpd-ipv-1 \ --ip 192.168.56.4 --net=ipvlan_1 \ httpd:2.4 -- 2번째 호스트에서 apache 컨테이너로 ping - 통신 가능 [test@test2 ~]$ ping -c3 192.168.56.4 PING 192.168.56.4 (192.168.56.4) 56(84) bytes of data. 64 bytes from 192.168.56.4: icmp_seq=1 ttl=64 time=0.567 ms 64 bytes from 192.168.56.4: icmp_seq=2 ttl=64 time=0.716 ms 64 bytes from 192.168.56.4: icmp_seq=3 ttl=64 time=0.367 ms -- 2번째 호스트에서 apache 컨테이너로 80포트 접속 - 통신 가능 [hyunho@wmp ~]$ curl http://192.168.56.4 <html><body><h1>It works!</h1></body></html> [hyunho@wmp ~]$ -- 첫번째 호스트 centos-ipv-1 컨테이너로 진입 [test@test1 ~]$ docker exec -it centos-ipv-1 /bin/bash -- 1번 서버의 centos-ipv-1 컨테이너에서 -- apache 컨테이너로 ping - 통신가능 [root@0f78229dcde1 /]# ping -c3 192.168.56.4 PING 192.168.56.4 (192.168.56.4) 56(84) bytes of data. 64 bytes from 192.168.56.4: icmp_seq=1 ttl=64 time=0.054 ms 64 bytes from 192.168.56.4: icmp_seq=2 ttl=64 time=0.030 ms 64 bytes from 192.168.56.4: icmp_seq=3 ttl=64 time=0.034 ms -- 1번 서버의 centos-ipv-1 컨테이너에서 -- apache 컨테이너로 80 포트 접속 - 통신가능 [root@0f78229dcde1 /]# curl http://192.168.56.4 <html><body><h1>It works!</h1></body></html> -- 2번 호스트 centos-ipv-2 로 접속 [test@test2 ~]$ docker exec -it centos-ipv-2 /bin/bash -- 2번 호스트 centos-ipv-2 에서 -- 번 호스트 apache 컨테이너로 ping - 통신 가능 [root@bf3493f4300a /]# ping -c3 192.168.56.4 PING 192.168.56.4 (192.168.56.4) 56(84) bytes of data. 64 bytes from 192.168.56.4: icmp_seq=1 ttl=64 time=0.405 ms 64 bytes from 192.168.56.4: icmp_seq=2 ttl=64 time=0.385 ms 64 bytes from 192.168.56.4: icmp_seq=3 ttl=64 time=0.324 ms -- 2번 호스트 centos-ipv-2 에서 -- 번 호스트 apache 컨테이너로 80 포트 접속 - 통신 가능 [root@bf3493f4300a /]# curl http://192.168.56.4 <html><body><h1>It works!</h1></body></html>
위와 같이 ipvlan 은 호스트OS의 IP대역대를 할당 받기 때문에 컨테이너와 같은 호스트 만 통신이 안될 뿐 다른 컨테이너 그리고 외부라고 볼 수 있는 다른 호스트 와 통신이 자유롭게 되는 것을 확인 할 수 있습니다.
다른 PC 에서 통신을 하면 아래와 같이 ping 이나 80포트의 접속이 자유롭게 되는 것을 확인 할 수 있습니다 다만 특이점으로는 arp 정보에서(mac 정보) 같은 호스트에서 실행된 컨테이너와 해당 호스트의 mac 주소값이 동일 하는 것 입니다.
-- 다른 PC에서 ping MacBook-Air:~ ping -c2 192.168.56.2 64 bytes from 192.168.56.2: icmp_seq=0 ttl=64 time=0.215 ms 64 bytes from 192.168.56.2: icmp_seq=1 ttl=64 time=0.206 ms MacBook-Air:~ ping -c2 192.168.56.3 64 bytes from 192.168.56.3: icmp_seq=0 ttl=64 time=0.333 ms 64 bytes from 192.168.56.3: icmp_seq=1 ttl=64 time=0.267 ms MacBook-Air:~ ping -c2 192.168.56.4 64 bytes from 192.168.56.4: icmp_seq=0 ttl=64 time=0.480 ms 64 bytes from 192.168.56.4: icmp_seq=1 ttl=64 time=0.218 ms -- 다른 PC에서 80포트 접속 MacBook-Air:~ curl http://192.168.56.4 <html><body><h1>It works!</h1></body></html> curl http://192.168.56.4 -- arp 정보 조회 MacBook-Air:~ arp -a ? (192.168.56.2) at 8:0:27:85:9:39 on vboxnet0 ifscope [ethernet] <-- 호스트1의 컨테이너 ? (192.168.56.3) at 8:0:27:60:cd:90 on vboxnet0 ifscope [ethernet] <-- 호스트2의 컨테이너 ? (192.168.56.4) at 8:0:27:85:9:39 on vboxnet0 ifscope [ethernet] <-- 호스트1의 컨테이너 ? (192.168.56.95) at 8:0:27:85:9:39 on vboxnet0 ifscope [ethernet] <-- 호스트1 ? (192.168.56.111) at 8:0:27:60:cd:90 on vboxnet0 ifscope [ethernet] <-- 호스트2
이전의 macvlan 은 각각의 별도의 mac address 를 할당 받았지만 ipvlan은 별도의 mac 주소는 할당 받지 못합니다.
여기까지 간략하게 bridge, macvlan,ipvlan 의 차이를 확인해보았습니다.
(테스트 완료 후 도커 이미지 및 네트워크를 모두 정리 하였습니다.)
2. Docker 실행의 이해
Docker 는 가상머신(VirtualMachine)이 구동되는 형태가 아닌 도커 이미지에서 설정된 또는 실행할 때 수행 한 명령어 등을 수행하는 컨테이너 입니다. 아래 몇가지 테스트를 통해 확인 해보겠습니다.
Linux 도커 컨테이너 명령어 실행
리눅스 이미지의 컨테이너를 실행하거나 명령어를 수행하는 경우 아래와 같이 실행 됩니다.
-- 먼저 도커 이미지를 다운로드 받음 [devops@docker1 ~]$ docker pull centos:7 [devops@docker1 ~]$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE httpd 2.4 30287d899656 8 days ago 138MB centos 7 8652b9f0cb4c 7 months ago 204MB <--- [devops@docker1 ~]$ docker run --name ts_centos centos:7 [devops@docker1 ~]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [devops@docker1 ~]$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cb105e3f3519 centos:7 "/bin/bash" 8 seconds ago Exited (0) 7 seconds ago ts_centos [devops@docker1 ~]$ docker run --name ts_centos3 centos:7 ls anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var -- docker ps -a 로 조회 [devops@docker1 ~]$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ae1aa8285b85 centos:7 "ls" About a minute ago Exited (0) About a minute ago ts_centos2 cb105e3f3519 centos:7 "/bin/bash" 3 minutes ago Exited (0) 3 minutes ago ts_centos
위의 수행 결과 처럼 2개의 컨테이너 모두 STATUS : Exited (0) 으로 종료된 상태 입니다.
docker run centos:7 을 통해 실행 후 OS 에 진입하여 필요한 패키지도 설치하고 여러가지 필요한 작업을 할수 있을 것이라고 생각 할 수 있습니다. 하지만 centos:7 이미지를 실행하면 바로 종료되는 것을 확인할 수 있습니다.
컨테이너를 위에서 같이 실행했을 경우 계속 실행 중 라면 그것은 VM 이라고 봐야 할 것 입니다. 컨테이너는 실행시 정해진 명령어의 집합이나 실행시 주어진 인자나 명령어 등을 수행을 하는 것이라고 이해해도 무방할 것 같습니다.
여러 컨테이너 이미지 중에서 지금 과 같은 리눅스 이미지가 아닌 httpd 나 nginx 과 컨테이너의 경우 기본적인 이미지 설정에서실행시 백그라운드에서 데몬이 구동되어 접속 기다리고 있는 즉 프로세스가 무언가 하고있기 때문에 컨테이너도 종료되지 않는 것입니다.
그래서 결론적으로 방금 centos:7 는 /bin/bash 나 ls 와 같은 초기 명령어의 실행이 완료가 되었기 때문에 컨테이너가 종료가 된 것 입니다.
다른 실행 방법으로 실행시 foreground 로 하여 -it 인자를 사용할 수 있습니다. -i 는 Interactive 모드로 표준입출력 에 해당하는 옵션이며, t 는 TTY 텍스트 터미널 관련 사용과 관련된 옵션 입니다.
[devops@docker1 ~]$ docker run -it --name ts_centos3 centos:7 [root@afce4ff37af8 /]# ls -al total 12 drwxr-xr-x 1 root root 6 Jul 1 14:42 . drwxr-xr-x 1 root root 6 Jul 1 14:42 .. -rwxr-xr-x 1 root root 0 Jul 1 14:42 .dockerenv -rw-r--r-- 1 root root 12114 Nov 13 2020 anaconda-post.log lrwxrwxrwx 1 root root 7 Nov 13 2020 bin -> usr/bin drwxr-xr-x 5 root root 360 Jul 1 14:42 dev drwxr-xr-x 1 root root 66 Jul 1 14:42 etc drwxr-xr-x 2 root root 6 Apr 11 2018 home lrwxrwxrwx 1 root root 7 Nov 13 2020 lib -> usr/lib lrwxrwxrwx 1 root root 9 Nov 13 2020 lib64 -> usr/lib64 drwxr-xr-x 2 root root 6 Apr 11 2018 media drwxr-xr-x 2 root root 6 Apr 11 2018 mnt drwxr-xr-x 2 root root 6 Apr 11 2018 opt dr-xr-xr-x 120 root root 0 Jul 1 14:42 proc dr-xr-x--- 2 root root 114 Nov 13 2020 root drwxr-xr-x 11 root root 148 Nov 13 2020 run lrwxrwxrwx 1 root root 8 Nov 13 2020 sbin -> usr/sbin drwxr-xr-x 2 root root 6 Apr 11 2018 srv dr-xr-xr-x 13 root root 0 Jul 1 14:42 sys drwxrwxrwt 7 root root 132 Nov 13 2020 tmp drwxr-xr-x 13 root root 155 Nov 13 2020 usr drwxr-xr-x 18 root root 238 Nov 13 2020 var [root@afce4ff37af8 /]# exit exit [devops@docker1 ~]$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES afce4ff37af8 centos:7 "/bin/bash" About a minute ago Exited (0) 51 seconds ago ts_centos3 <-- ae1aa8285b85 centos:7 "ls" 32 minutes ago Exited (0) 32 minutes ago ts_centos2 cb105e3f3519 centos:7 "/bin/bash" 34 minutes ago Exited (0) 34 minutes ago ts_centos
위와 같이 Interactive 모드를 통해서 컨테이너가 계속 실행되어 보이지만 exit 로 쉘을 종료하게 되면 사용한 it 옵션이 종료가 됨에 따라 컨테이너도 같이 종료가 되게 됩니다.
그래서 도커를 백그라운드로 수행하면서 이전의 apache 컨테이너와 같이 계속 사용하는 방법은 무엇이 계속 수행되고 있거나 입력 등을 대기하는 등의 runing 상태이면 컨테이너는 계속 동작 하게 됩니다.
먼저 아래와 같이 무언가를 계속 수행하는 명령어를 포함하여 컨테이너를 실행하게 되면 컨테이너가 종료되지 않고 게속 running 상태를 유지 할 수 있게 됩니다.
[devops@docker1 ~]$ docker run -d --name ts_centos4 centos:7 /bin/sleep 3660s [devops@docker1 ~]$ docker run -d --name ts_centos5 centos:7 /bin/bash -c 'dd if=/dev/zero of=/dev/null' [devops@docker1 ~]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 15d7e2303000 centos:7 "/bin/bash -c 'dd if…" 12 seconds ago Up 11 seconds ts_centos5 ff5f16863cc3 centos:7 "/bin/sleep 3660s" 33 seconds ago Up 32 seconds ts_centos4
첫번째는 sleep 3660s 를 설정하였기 때문에 3660초 뒤에는 컨테이너가 종료될 것 입니다.
그리고 두번째는 계속 유지가 되겠지만 dd copy 가 계속 수행중이며 /dev/null 로 데이터를 복사하는 작업은 부하를 유발하게 됩니다.
보통 OS 컨테이너 실행시 이와 같이 컨테이너 실행을 유지하기 위해서 명령어 인자 등을 포함하여 실행해야 하며 컨테이너가 종료되지 않고 계속 실행되게 하는 것에는 아주 많은 방법이 있습니다
위의 실행은 이해를 돕기 위한 예시이며 부하 없이 백그라운드 형태로 수행이 되어 컨테이너의 실행을 유지하는 방법을 사용하는 것이 가장 좋을 것 입니다.
많은 방법 중에 아래 2가지도 사용해볼 수 있을 것 같습니다.
[devops@docker1 ~]$ docker run -d --name ts_centos6 centos:7 /sbin/init [devops@docker1 ~]$ docker run -d -it --name ts_centos7 centos:7 [devops@docker1 ~]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cb7a525d83c7 centos:7 "/bin/bash" 3 seconds ago Up 2 seconds ts_centos7 1e4985823453 centos:7 "/sbin/init" 8 seconds ago Up 7 seconds ts_centos6 15d7e2303000 centos:7 "/bin/bash -c 'dd if…" 11 minutes ago Up 11 minutes ts_centos5 ff5f16863cc3 centos:7 "/bin/sleep 3660s" 11 minutes ago Up 11 minutes ts_centos4
-d -it 의 경우 attach 로 하여 컨테이너에 접속한 후 exit 하게 되면 컨테이너가 종료 됩니다. 이럴 경우 attach 가 아닌 접속시 exec -it /bin/bash 를 사용 하면 됩니다.
devops@docker1 ~]$ docker attach ts_centos7 [root@cb7a525d83c7 /]# exit exit [devops@docker1 ~]$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cb7a525d83c7 centos:7 "/bin/bash" About a minute ago Exited (0) 5 seconds ago ts_centos7 <-- 종료됨 1e4985823453 centos:7 "/sbin/init" 2 minutes ago Up About a minute ts_centos6 15d7e2303000 centos:7 "/bin/bash -c 'dd if…" 12 minutes ago Up 12 minutes ts_centos5 ff5f16863cc3 centos:7 "/bin/sleep 3660s" 13 minutes ago Up 13 minutes ts_centos4 afce4ff37af8 centos:7 "/bin/bash" 34 minutes ago Exited (0) 33 minutes ago ts_centos3 ae1aa8285b85 centos:7 "ls" About an hour ago Exited (0) About an hour ago ts_centos2 cb105e3f3519 centos:7 "/bin/bash" About an hour ago Exited (0) About an hour ago ts_centos
attach 를 통해서 컨테이너에 접속후 exit 하여 shell 을 나오게 되면 종료가 됨으로 exec -it /bin/bash 를 사용해서 접속하면 됩니다.
[devops@docker1 ~]$ docker run -d -it --name ts_centos8 centos:7 [devops@docker1 ~]$ docker exec -it ts_centos8 /bin/bash [root@a370625aae37 /]# exit exit [devops@docker1 ~]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a370625aae37 centos:7 "/bin/bash" 19 seconds ago Up 19 seconds ts_centos8 <-- 계속 runing 상태임 1e4985823453 centos:7 "/sbin/init" 4 minutes ago Up 4 minutes ts_centos6 15d7e2303000 centos:7 "/bin/bash -c 'dd if…" 15 minutes ago Up 15 minutes ts_centos5 ff5f16863cc3 centos:7 "/bin/sleep 3660s" 15 minutes ago Up 15 minutes ts_centos4
이와 같은 방법 등으로 컨테이너가 종료되지 않고 계속 사용 유지를 할 수 있습니다.
여기서는 컨테이너의 실행시 동작에 대해서 간단히 확인하였으며, 뒤에 진행할 이미지를 만들어서 컨테이너를 구동하는 단계에서 컨테이너 이미지를 생성시 어떤 명령어나 인자값을 사용하는지에 따라 의도 된 것 처럼 컨테이너가 실행 상태 상태 일수도 있고 컨테이너 실행 후 종료 될 수도 있습니다.
그래서 뒤에서 언급 될 도커 이미지를 만들때 어떤 명령어를 수행해야하는지도 중요한 부분이며 그러한 이유 등을 해당 내용을 통해서 이해를 하면 될 것 같습니다.
이어지는 다음 글
3. Reference
Reference Llink
forums.docker.com/promiscuous-mode-needed [Link]
ssup2.github.io/Linux_macvlan_macvtap [Link]
youngmind.tistory.com/Docker-2-macvlan [Link]
docker.com/understanding-docker-networking [Link]
docker.com/ipvlan [Link]
다른 연관된 글
Principal DBA(MySQL, AWS Aurora, Oracle)
핀테크 서비스인 핀다에서 데이터베이스를 운영하고 있어요(at finda.co.kr)
Previous - 당근마켓, 위메프, Oracle Korea ACS / Fedora Kor UserGroup 운영중
Database 외에도 NoSQL , Linux , Python, Cloud, Http/PHP CGI 등에도 관심이 있습니다
purityboy83@gmail.com / admin@hoing.io
엄청난 정성 ..! 감사합니다
안녕하세요
도움이 되었다니 다행입니다.
정성스런 댓글 감사합니다.
좋은 하루 되세요🙇🏻♂️