becool

20210811 (수) docker network, volume 본문

docker

20210811 (수) docker network, volume

gusalstm 2021. 8. 11. 16:31
반응형

09:33

 

Docker Container Life Cycle

https://www.learnsteps.com/the-life-cycle-of-a-container/

docker build This is used to build the docker image and then put it to the image registry.
docker pull This is used to pull the image build in the above portion from the registry.
docker run This will run the image as a docker container.
docker pause It is used to pause the docker container.
docker unpause It is used to unpause the docker container.
docker stop Stops the docker container.
docker start Starts back the docker container.
docker kill Kills the docker container.

 

docker container create

docker container start

docker container attach : PID 1번에 대해서 attach 하는 원리이므로 PID 1번에 관해서만 영향을 끼침

CTRL + p, CTRL + q

  → ps종료하지 않고 쉘에서 빠져나오는 방법

  → exit 명령어 사용시 ps 종료와 함께 빠져나오게 됨

 

 

 Docker Network (docker network create --driver _____)

    Bridge network

    컨테이너가 사용하는 네트워크. 외부와 통신이 가능한 네트워크. 외부 네트워크와 NAT로 연결됨

 

    Host network

    Docker Host 의 네트워크 정보 (IP주소, Port, Hostname)을 공유하여 사용함

 

    Null network

    컨테이너에 대한 네트워크를 사용하지 않음 

 

    Overlay network

    서로다른 Docker Host의 Container 간의 연결, 통신하는 네트워크

 

    Macvlan network

    Mac Address를 컨테이너에 할당. Docker Daemon의 트래픽을 Mac 주소를 사용하여 라우팅하는 네트워크

   

 Container link : 컨테이너 간 이름으로 통신할 수 있도록 지원하는 기능

   → 매번 시작,정지 시 아이피가 변경되더라도 이름으로 통신을 할 수 있게 됨.

   ($ docker container run -it --network NETWORK --link CONTAINER --name NAME IMAGE ) 

   /etc/hosts 확인

 

 Container port forwarding : 호스트에 들어오는 요청을 포트포워딩을 통해 컨테이너로 전달

   ($ docker container run -it -p HOSTPORT:CONTAINERPORT --name CONTAINER_NAME IMAGE)

 

 

[user@docker-host0 ~]$ docker container inspect -f "{{ .NetworkSettings.Networks.network2.IPAddress }}" centos7-net2-1
192.168.200.3
[user@docker-host0 ~]$ docker container inspect -f "{{ .NetworkSettings.Networks.network2.IPAddress }}" centos7-net2-2

[user@docker-host0 ~]$ docker container inspect -f "{{ .NetworkSettings.Networks.network2.IPAddress }}" centos7-net2-3
192.168.200.2
[user@docker-host0 ~]$ docker container inspect -f "{{ .NetworkSettings.Networks.network2.IPAddress }}" centos7-net2-1
192.168.200.2
[user@docker-host0 ~]$ docker container inspect -f "{{ .NetworkSettings.Networks.network2.IPAddress }}" centos7-net2-2
192.168.200.3
[user@docker-host0 ~]$ docker container inspect -f "{{ .NetworkSettings.Networks.network2.IPAddress }}" centos7-net2-3
192.168.200.5

→ stop, start 하게 되면 매번 아이피가 변경됨.  → container link 사용
728x90
※ PROMISC 모드 

[user@docker-host0 ~]$ sudo ifconfig enp0s3 promisc
[sudo] password for user:
[user@docker-host0 ~]$ ifconfig enp0s3
enp0s3: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST>  mtu 1500

1. 무차별 모드/혼잡 모드 (Promiscuous Mode)
  ㅇ LAN 카드
     - 수신된 프레임이 자신과 상관 없는 목적지 주소를 갖는데도 이를 모두 수신하는 모드
     * 대부분의 운영체제에서는 일반 사용자 모드에서 LAN카드가 무차별 모드로 동작함을 허용하지 않음
     * 따라서, 무차별 모드 지원을 위해서는 관리자 구동 허가가 필요

버츄얼 박스 " 머신 > 설정 > NAT network > 고급설정 > 무작위 모드 > 모두 허용 " 변경해주어야 사용가능

 

 

https://docs.docker.com/storage/bind-mounts/

 

 볼륨

   데이터를 저장하기 위한 저장 공간

   → 컨테이너는 앱 구동을 위한 최소한의 사이즈를 활용하고, 사용 후 삭제 될 수 있으므로 (k8s)

       데이터 저장을 컨테이너에 하지 않는다.

 

  1) Bind mount 방식

      호스트의 특정 디렉터리와 컨테이너의 디렉터리를 연결하는 방식

      호스트의 파일 시스템에 의존

 

  2) Volume 방식

      도커에 의해 관리되는 스토리지로 docker 명령어를 사용하여 생성할 수 있음

  

  bind mout

   $ docker container create -i -t -v HOST_DIRECTORY:CONTAINER_DIRECTORY --name NAME IMAGE

  ( $ docker container create -i -t -v /home/app_data:/test --name centos7-bind centos:7 )

 

  volume

   $ docker run -i -t -v VOLUMENAME:CONTAINER_PATH --name NAME IMAGE

  ( [user@docker-host0 ~]$ docker run -i -t -v vol1: --name centos7-vol1 centos:7 )

 

##### bind mount 예제 #####
bind mount를 통한 index.html 공유 → 컨테이너는 웹 서비스만 제공하고, 웹 페이지 데이터는 host에서 제공하게 됨.

[user@docker-host0 webapp]$ echo Hello Docker > index.html
[user@docker-host0 webapp]$ echo Bind Mount >> index.html
[user@docker-host0 webapp]$ cat index.html  → host의 특정 디렉터리에 index.html 파일 생성
Hello Docker
Bind Mount

[user@docker-host0 webapp]$ cd ~
[user@docker-host0 ~]$ docker container create -i -t -v /work/webapp/:/var/www/html/ --name centos7-bindweb centos:7  → 해당 디렉터리를 bindmount로 공유하는 컨테이너 생성 (container mountpoint : /var/www/html )
7ff53299ec99561b42f4191174cacd7a24af65f3c835f1fff32c020d90838a20
[user@docker-host0 ~]$ docker container start centos7-bindweb
centos7-bindweb
[user@docker-host0 ~]$ docker container attach centos7-bindweb
[root@7ff53299ec99 /]# yum install -y httpd

[root@7ff53299ec99 /]# cd /var/www/html/
[root@7ff53299ec99 html]# cat index.html → 파일 공유 확인
Hello Docker
Bind Mount
[root@7ff53299ec99 html]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.7  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:07  txqueuelen 0  (Ethernet)
        RX packets 25278  bytes 44086538 (42.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 14578  bytes 792517 (773.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@7ff53299ec99 html]# /usr/sbin/httpd -DFOREGROUND & → web service 시작
[1] 110
[root@7ff53299ec99 html]# AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.7. Set the 'ServerName' directive globally to suppress this message


테스트
[user@docker-host0 webapp]$ curl 172.17.0.7 → 컨테이너 ip로 접속시도. 정상적으로 index.html 확인
Hello Docker
Bind Mount
[user@docker-host0 webapp]$ curl http://172.17.0.7
Hello Docker
Bind Mount

 

 

##### volume 예제 #####

[user@docker-host0 ~]$ docker volume create vol1 → 볼륨 생성
vol1

[user@docker-host0 ~]$ docker volume inspect vol1
[
    {
        "CreatedAt": "2021-08-11T16:07:59+09:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/vol1/_data",
        "Name": "vol1",
        "Options": {},
        "Scope": "local"
    }
]
[user@docker-host0 ~]$

[user@docker-host0 ~]$ docker run -i -t -v vol1:/work --name centos7-vol1 centos:7
[root@a9edd163be13 /]# cd /work/  → 자동으로 /work 디렉터리가 생성되어있음

##### 테스트 #####
 해당 디렉터리의 내용들은 호스트에 저장되며, 다른 컨테이너에 마운트하여도 데이터가 여전히 살아있는지 확인

[root@a9edd163be13 work]# mkdir vol_dir1 → 파일/디렉터리 만들고 확인
[root@a9edd163be13 work]# touch vol_file
[root@a9edd163be13 work]# ls
vol_dir1  vol_file

[root@a9edd163be13 work]# exit
exit

[user@docker-host0 ~]$ docker container rm centos7-vol1  → 컨테이너 삭제
centos7-vol1
[user@docker-host0 ~]$ docker container run -it -v vol1:/home/docker_vol --name centos-voltest centos:7 

 → 새로운 컨테이너 생성
[root@3f4a49a3393a /]# cd ~
[root@3f4a49a3393a ~]# cd /home/docker_vol/ → volume mount point에서 다른 컨테이너가 만든 데이터들이 살아있음을 확인
[root@3f4a49a3393a docker_vol]# ls
vol_dir1  vol_file

 

 

반응형

 

설치 및 설정

[user@docker-host0 ~]$ docker container create -t -i -p 2100:21 --name centos7_ftp_exam1 centos:7
aea9b871172724ecbf4c85427cf70294992d155f62c741491797b4b168f3215b
[user@docker-host0 ~]$ docker container start centos7_ftp_exam1
centos7_ftp_exam1
[user@docker-host0 ~]$ docker attach centos7_ftp_exam1

[root@aea9b8711727 /]#

[root@aea9b8711727 /]# yum install -y vsftpd net-tools

[root@aea9b8711727 pub]# /usr/sbin/vsftpd &
[1] 65
[root@aea9b8711727 pub]# read escape sequence

[user@docker-host0 ~]$ docker container ls |grep 2100
aea9b8711727   centos:7          "/bin/bash"   About a minute ago   Up About a minute   0.0.0.0:2100->21/tcp, :::2100->21/tcp   centos7_ftp_exam1

[user@docker-host0 ~]$ sudo firewall-cmd --add-service=ftp
[sudo] password for user:
success
[user@docker-host0 ~]$ sudo firewall-cmd --add-port=2100/tcp
success



접속테스트

[user@docker-host0 ~]$ sudo yum install ftp -y

[user@docker-host0 ~]$ ftp 172.17.0.5
Connected to 172.17.0.5 (172.17.0.5).
220 (vsFTPd 3.0.2)
Name (172.17.0.5:user): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> exit
221 Goodbye.
[user@docker-host0 ~]$ ftp -p 192.168.56.100 2100
Connected to 192.168.56.100 (192.168.56.100).
220 (vsFTPd 3.0.2)
Name (192.168.56.100:user): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> exit
221 Goodbye.



[user@docker-host0 ~]$ docker volume create user_data
user_data
[user@docker-host0 ~]$ docker container run -i -t -v user_data:/data/ --name centos7_volume_exam centos:7
[root@40ac0779037f /]# cd /data
[root@40ac0779037f data]# ls
[root@40ac0779037f data]# echo hello > file
[root@40ac0779037f data]# cat file
hello
[root@40ac0779037f data]# exit
exit
[user@docker-host0 ~]$ docker container rm centos7_volume_exam
centos7_volume_exam
[user@docker-host0 ~]$ docker container run -i -t -v user_data:/data/ --name centos7_volume_exam2 centos:7
[root@e5f384bded60 /]# ls /data/
file
[root@e5f384bded60 /]# cat /data/file
hello

 

 

 

728x90
Comments