컨테이너와 Docker (3) - 도커 네트워크 - OS 컨테이너 실행

Share

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]



다른 연관된 글

 

 

 

 

2
0
글에 대한 당신의 생각을 기다립니다. 댓글 의견 주세요!x