본문 바로가기

[혁신성장 청년인재] 인공지능을 활용한 보안전문가 양성과정

Day16-2: 도커 볼륨 | 도커 네트워크

도커에서 데이터 관리

컨테이너에 생성되는 모든 파일은 컨테이너 레이어에 저장되며, 컨테이너가 삭제될 때 같이 삭제되는 런타임 데이터이다. 따라서 이 데이터를 저장하려면 볼륨을 사용해야 한다. 1) Bind Mount 와 2)볼륨을 알아보자.

 

1) Bind Mount

컨테이너의 디렉토리를 호스트의 특정 디렉토리에 마운트해서 쓰는거!

[admin@localhost ~]$ docker run -dit --name os3 -v ~/bm1:/tmp/mount centos:latest 
f820f664c8fc58bf5ce7053b82773906971b25e078582bfb69c25d3e318ca8ec
[admin@localhost ~]$ docker exec os3 ls -l /tmp/mount
total 0
[admin@localhost ~]$ touch ~/bm1/test.txt
[admin@localhost ~]$ docker exec os3 ls -l /tmp/mount
total 0
-rw-rw-r--. 1 1000 1000 0 Jul 28 02:53 test.txt
[admin@localhost ~]$ docker exec os3 touch /tmp/mount/test2.txt
[admin@localhost ~]$ ls -l ~/bm1
total 0
-rw-r--r--. 1 root  root  0 Jul 28 11:55 test2.txt
-rw-rw-r--. 1 admin admin 0 Jul 28 11:53 test.txt

2) volume사용

# 볼륨 생성
[admin@localhost ~]$ docker volume create vol1
vol1

# 생성된 볼륨의 정보 확인
[admin@localhost ~]$ docker inspect vol1
[
    {
        "CreatedAt": "2020-07-28T11:56:56+09:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/vol1/_data",
        "Name": "vol1",
        "Options": {},
        "Scope": "local"
    }
]

# 해당 위치로 이동
[admin@localhost ~]$ su -
Password: 
Last login: Tue Jul  7 15:38:54 KST 2020 on pts/0
[root@localhost ~]# cd /var/lib/docker/volumes/vol1/_data

# 해당 경로에 아무것도 없음을 확인
[root@localhost _data]# ls -la
total 0
drwxr-xr-x. 2 root root  6 Jul 28 11:56 .
drwxr-xr-x. 3 root root 19 Jul 28 11:56 ..
[root@localhost _data]# exit
logout

# os4 컨테이너의 /tmp/volume에 vol1을 연결
[admin@localhost ~]$ docker run -dit --name os4 -v vol1:/tmp/volume centos:latest
10fda965425ef84441fd63f75ff105e46b1a3643cea7d27e55c7765c5aaff011

# os4 컨테이너의 /tmp/volume 에 아무것도 없음
[admin@localhost ~]$ docker exec os4 ls -l /tmp/volume
total 0

# os4 컨테이너의 /tmp/volume 에 test.txt 를 생성
[admin@localhost ~]$ docker exec os4 touch /tmp/volume/test.txt
[admin@localhost ~]$ docker exec os4 ls -l /tmp/volume
total 0
-rw-r--r--. 1 root root 0 Jul 28 03:01 test.txt

# vol1 의 해당 위치에 가면 test.txt 가 확인됨.
[root@localhost _data]# ls -l
total 0
-rw-r--r--. 1 root root 0 Jul 28 03:01 test.txt

도커 네트워크

1) bridge 

bridge 는 컨테이너가 사용하는 프라이빗 네트워크! 

외부로 통신시에는 NAPT(Network Address Port Translation)통신을 사용하며, 외부에서 birdge로 통신하려면 포트포워딩을 사용해야한다. 

 

NAPT: Network Address Port Translation

호스트OS가 보유하고 있는 공용 IP를 컨테이너가 통신할 때 공유하기 위한 방법: 통신이 브리지를 통과할 때 IP, Port 등의 정보를 변경시킴

 

네트워크 생성

[admin@localhost ~]$ docker network create --subnet 192.168.100.0/24 --gateway 192.168.100.254 net1 
808b642a48bd2129177e0a4c5834dfb32d07371813972df8007f44e4a445997a 



[admin@localhost ~]$ docker network ls 
NETWORK ID          NAME                DRIVER              SCOPE 
86a75dd22774        bridge              bridge              local 
6c02219c5585        host                host                local 
808b642a48bd        net1                bridge              local 
546914b832af        none                null                local 



[admin@localhost ~]$ docker inspect net1 
[ 
    { 
        "Name": "net1", 
        "Id": "808b642a48bd2129177e0a4c5834dfb32d07371813972df8007f44e4a445997a", 
        "Created": "2020-07-28T13:39:54.346442401+09:00", 
        "Scope": "local", 
        "Driver": "bridge", 
        "EnableIPv6": false, 
,, 이하 생략

컨테이너가 지정된 네트워크를 사용하게 하기

run 할 때  --network 옵션 사용

[admin@localhost ~]$ docker run -dit --name os5 --network net1 centos:latest  
6f9848a8f887911fcd2d294f79e3d484203af661651071711172a964b406ddc7

 

2) host

호스트의 네트워크를 컨테이너와 공유해서 사용하는 방법!

호스트가 사용하는 포트와 충돌해서는 안됨

 

[admin@localhost ~]$ docker run -d --name web4 --network host httpd:latest  
b62c167c60900e30a968bf125bf62d5d050dde3327ff64dfe6b66ca34e32a931

[admin@localhost ~]$ curl localhost 
<html><body><h1>It works!</h1></body></html>

 

web4컨테이너는 호스트와 네트워크 정보를 공유하기 때문에 localhost로 접근할 수 있다. 

 

3) null (none)

: 네트워크 기능 사용하지 않는다. 

4) overlay

: 서로 다른 도커 호스트를 연결하여 통신할 수 있도록 한다. 단일 호스트인 경우에 사용하지 않으며, 도커스웜(Docker Swarm)과 같은 클러스터 서비스에 사용된다. 

5) macvlan

MAC 주소를 컨테이너에 할당하여 도커 데몬이 트래픽을 컨테이너의 MAC주소로 라우팅 할 수 있게 한다. 

컨테이너가 실제 네트워크에 직접 연결할 때 사용한다.

 

NIC에 PRIMISC 모드 활성 (Promiscuous: 무차별 모드) 

[admin@localhost ~]$ sudo ip link set enp0s3 promisc on 

[admin@localhost ~]$ ip a s enp0s3 
2: enp0s3: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 
    link/ether 08:00:27:bf:fe:fe brd ff:ff:ff:ff:ff:ff 
    inet 10.0.2.4/24 brd 10.0.2.255 scope global noprefixroute dynamic enp0s3 
       valid_lft 311sec preferred_lft 311sec 
    inet6 fe80::887f:b291:ed44:ead/64 scope link noprefixroute  
       valid_lft forever preferred_lft forever 

macvlan 네트워크 생성 && macvlan 드라이버를 사용하는 컨테이너 생성

[admin@localhost ~]$ docker network create -d macvlan --subnet 10.0.2.0/24 --gateway=10.0.2.1 --ip-range=10.0.2.64/25 -o parent=enp0s3 macvlan1
18a06f401bd7e5b1b403a50bc240857d06b6d7e5732b9a679fc54d513ad109a8

[admin@localhost ~]$ docker run -itd --name os6 --network macvlan1 centos:latest 
1aedd075b5fdf916b2530ff65761e3069fbf58c3874239b897f7baeeb7def997

컨테이너의 통신

1) 링크(link)

[admin@localhost ~]$ docker run -dit --name os6 --link web3 centos:latest 
fa5fa112e92b8e73805898a703bc49d71a5b957def63e77804f1cd476bb231af
[admin@localhost ~]$ docker exec os6 cat /etc/hosts
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172.17.0.2	web3 b91ca38af36c
172.17.0.3	fa5fa112e92b

os6의 /etc/hosts 에 web3가 들어가있다. 

 

2) 포트포워딩 (docker run -p)

브릿지 네트워크를 사용하는 모든 컨테이너는 외부에서 접근할 때 포트포워딩을 사용해야 한다. 컨테이너 실행 시 -p 옵션을 사용하면 된다.  아래는 web5 컨테이너를 실행하면서 호스트의 8080포트로 접근했을 대 컨테이너의 80번 포트로 전달하는 포트포워딩 설정 예이다. 

[admin@localhost ~]$ docker run -d --name web5 -p 8080:80 httpd:latest 
ebeb909713dd14aa606c948860a73ec33b0ea8c41536794a1ae4bc42e7293ea1

[admin@localhost ~]$ docker ps
CONTAINER ID        IMAGE               COMMAND               PORTS                  NAMES
ebeb909713dd        httpd:latest        "httpd-foreground"    0.0.0.0:8080->80/tcp   web5

 

반응형