[Docker] 5일차 수업 정리

soyeon·2022년 9월 15일
0
post-thumbnail

Docker Container 관리

: docker의 기본 네트워크 구성은 bridge모드(local)
: bridge 모드의 네트워크 구성은 docker container만의 네트워크를 실 서버의 네트워크와 분리해 독립적으로 구성하는 네크워크 방식
: bridge는 local이라서 다른 bridge에 연결되어 있으면 통신이 되지 않는다. overlay로 통신해야 한다.

swarm: inactive. kubernetes와 같은 orchestration 기능. network cluster

  • 실습(컨테이너에 네트워크 추가 후 조회)
## terminal 1
kevin@hostos1:~$ docker run -it --name=add-net ubuntu:14.04 bash
root@00451dbd50fe:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:02
          inet addr:172.17.0.2

## terminal 2
kevin@hostos1:~$ docker ps
CONTAINER ID   IMAGE          COMMAND   CREATED          STATUS          PORTS     NAMES
00451dbd50fe   ubuntu:14.04   "bash"    53 seconds ago   Up 51 seconds             add-net

## network 생성하고 확인하기
kevin@hostos1:~$ docker network create web-network
2d566eb6c0ed04b5ad5b0e882cf222ac2fa7e30c4c9ed68fac6977b4d97c3b87
kevin@hostos1:~$ docker network ls
NETWORK ID     NAME          DRIVER    SCOPE
bef80bf665fd   apache-net    bridge    local
28afd9f697f3   app-service   bridge    local
870cfc3e4f8b   bridge        bridge    local
dabe73bda74b   host          host      local
9ab5a2927af1   netlb         bridge    local
089668ed9531   none          null      local
13500fdd939b   vswitch-net   bridge    local
11d9023bb702   web-net       bridge    local
2d566eb6c0ed   web-network   bridge    local

## ip 대역 확인하기
kevin@hostos1:~$ ifconfig
br-11d9023bb702: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.18.0.1
        
## container에 네트워크 추가 후 조회
kevin@hostos1:~$ docker network connect web-network add-net
kevin@hostos1:~$ docker exec add-net route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         172.17.0.1      0.0.0.0         UG    0      0        0 eth0
172.17.0.0      *               255.255.0.0     U     0      0        0 eth0
172.21.0.0      *               255.255.0.0     U     0      0        0 eth1

## terminal 1
## eht1이 생겼다.
root@00451dbd50fe:/# 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:288 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:57773 (57.7 KB)  TX bytes:167 (167.0 B)

eth1      Link encap:Ethernet  HWaddr 02:42:ac:15:00:02
          inet addr:172.21.0.2  Bcast:172.21.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:104 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:18068 (18.0 KB)  TX bytes:0 (0.0 B)

## 네트워크 상세 정보
kevin@hostos1:~$ docker network inspect web-network

## docker network 사용 중인 상태에서 삭제 시 에러가 발생한다.
kevin@hostos1:~$ docker network rm web-network
Error response from daemon: error while removing network: network web-network id 2d566eb6c0ed04b5ad5b0e882cf222ac2fa7e30c4c9ed68fac6977b4d97c3b87 has active endpoints

## add-net을 stop 시킨다.
kevin@hostos1:~$ docker stop add-net

## 또는, 다른 방법
kevin@hostos1:~$ docker network disconnect web-network add-net
kevin@hostos1:~$ docker network rm web-network
  • docker container network
## 네트워크 생성
kevin@hostos1:~$ docker network create back-net
kevin@hostos1:~$ docker network create front-net

## 네트워크 정보 확인
kevin@hostos1:~$ docker network inspect back-net
...
 "Subnet": "172.22.0.0/16",
 "Gateway": "172.22.0.1"
...

## 네트워크 정보 확인
...
kevin@hostos1:~$ docker network inspect front-net
 "Subnet": "172.23.0.0/16",
 "Gateway": "172.23.0.1"
...

## containerA 생성하기
kevin@hostos1:~$ docker run -it --name=containerA --net=back-net ubuntu:14.04

## ip 확인하기
root@b0c8f982e7c8:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:16:00:02
          inet addr:172.22.0.2

## containerB 생성하기
kevin@hostos1:~$ docker run -it --name=containerB --net=front-net ubuntu:14.04

## ip 확인하기
root@a2d1d5486a01:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:17:00:02
          inet addr:172.23.0.2

kevin@hostos1:~$ docker network connect back-net containerB

kevin@hostos1:~$ docker exec containerA route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         hostos1         0.0.0.0         UG    0      0        0 eth0
172.22.0.0      *               255.255.0.0     U     0      0        0 eth0
kevin@hostos1:~$ docker exec containerB route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         hostos1         0.0.0.0         UG    0      0        0 eth1
172.22.0.0      *               255.255.0.0     U     0      0        0 eth1
172.23.0.0      *               255.255.0.0     U     0      0        0 eth0

자원 소비 제어

컨테이너에 자원 할당 -> cgroups -> unlimit(기본값)

제한 구성

  1. CPU -> cpu register에 작업 등록 -> tiem scheduling -> RR
  • core 개수 count
  ## core 개수 알아내기
  kevin@hostos1:~$ grep -c processor /proc/cpuinfo
  4

  ## htop으로 사용량 보기
  kevin@hostos1:~$ sudo apt -y install htop
  kevin@hostos1:~$ htop

  ## 과부하 주기
  kevin@hostos1:~$ sudo apt -y install stress

  ## 과부하 주기
  kevin@hostos1:~$ stress -c 1 -t 10s

  • time scheduling
kevin@hostos1:~$ docker pull leecloudo/stress:1.0
kevin@hostos1:~$ docker run -d --name=cpu_1024 --cpu-shares 1024 leecloudo/stress:1.0 stress -c 4
kevin@hostos1:~$ docker run -d --name=cpu_512 --cpu-shares 512 leecloudo/stress:1.0 stress -c 4

  • 비율(rate %)
kevin@hostos1:~$ docker run -d --name=cpuset1 --cpuset-cpus 2 leecloudo/stress:1.0 stress --cpu 1

## 비율 설정하기
kevin@hostos1:~$ docker update --cpus=0.2 cpuset1

: 제한을 받아서 줄어들게 되었다.

kevin@hostos1:~$ docker run -d --name=cpuset2 --cpuset-cpus 0,3 leecloudo/stress:1.0 stress --cpu 2
kevin@hostos1:~$ docker update --cpus=0.2 cpuset2

: 두개이상 들어가면 합쳐서 20%가 된다.

  • core 지정하기
kevin@hostos1:~$ docker run -d --name=cpuset1 --cpuset-cpus 2 leecloudo/stress:1.0 stress --cpu 1

: core 2만 올라가고 있다.

  1. memory (physical / swap)
  • memory 제한하기
kevin@hostos1:~$ docker run -d --name=nginx200m --memory=200m nginx:1.23.1-alpine
kevin@hostos1:~$ docker inspect nginx200m | grep -i memory
            "Memory": 209715200,
            "KernelMemory": 0,
            "KernelMemoryTCP": 0,
            "MemoryReservation": 0,
            "MemorySwap": 419430400,
            "MemorySwappiness": null,

swap은 알아서 2배로 잡힌다.

## swap도 제한할 수 있다.
kevin@hostos1:~$ docker run -d --name=nginx200m --memory=200m --memory-swap=200m nginx:1.23.1-alpine
  • 최소 memory 사이즈
kevin@hostos1:~$ docker run -itd -m=4m --name=mydb mysql:5.7-debian
docker: Error response from daemon: Minimum memory limit allowed is 6MB.
See 'docker run --help'.

## 최소를 맞춰야 생성할 수 있다.
kevin@hostos1:~$ docker run -itd -m=6m --name=mydb mysql:5.7-debian
  1. disk
    disk의 성능 지표 : IOPS, MBPS
  kevin@hostos1:~$ sudo apt install sysstat
  kevin@hostos1:~$ iostat 2 2
  • container disk block I/O 제한
    : block I/O 옵션을 지정하지 않으면 I/O는 무제한
    : --device-write-bpx, --device-read-bps, --device-write-iops, --device-read-iops 옵션값으로 제한 값을 설정
## 옵션 없이. 제한 없이
kevin@hostos1:~$ docker run -it --rm ubuntu:14.04 bash
root@2bcf5f341ed3:/# dd if=/dev/zero of=test.out bs=1M count=10 oflag=direct
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.0224441 s, 467 MB/s

## 쓰고, 읽기 작업의 초당 제한을 설정
kevin@hostos1:~$ docker run -it --rm --device-write-bps /dev/sdb:1mb ubuntu:14.04 bash
root@bff5c6873d8e:/# dd if=/dev/zero of=test.out bs=1M count=10 oflag=direct
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 10.0091 s, 1.0 MB/s

kevin@hostos1:~$ docker run -it --rm --device-write-bps /dev/sdb:10mb ubuntu:14.04 bash
root@d8f16a11056a:/# dd if=/dev/zero of=test.out bs=1M count=10 oflag=direct
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 1.0088 s, 10.4 MB/s

Docker 주요 관리 대상

docker volume

: 공유 설정
host to container, container to container
docker volume

  • bind mount -> -v(--volume) - 사용자 관리
    : 호스트와 container 양쪽 경로를 붙여준다. 직접 지정해서 사용한다.
    호스트절대경로:컨테이너절대경로 -> -v /data/test1:/mount1
    만약에 없으면 자동으로 생성해준다.
    디렉터리에 연결(mount)을 하는데 fiile to file도 가능하다.

  • volume - 도커가 직접 경로 관리
    : docker volume create [volume_name] -> -v volume_name:/mount2
    자동으로 /var/lib/docker/volumes

  • tmpfs mount
    : 임시 영역

실습

  • host os directory와 container partition(blind mount)과 파일 공유
## 두개의 디렉토리 생성
kevin@hostos1:~$ mkdir hello1 hello2
kevin@hostos1:~$ cd hello1

## 파일 만들기
kevin@hostos1:~/hello1$ cat > test1.txt
test1     # 저장 후 종료(ctrl+d)
kevin@hostos1:~/hello1$ cd ..
kevin@hostos1:~$ cd hello2

## 파일 만들기
kevin@hostos1:~/hello2$ cat > test2.txt
test2

## 컨테이너 생성 blind mount
kevin@hostos1:~$ docker run -it \
> --name ubuntu_volume1 \
> -v /home/kevin/hello1:/hello1 \
> -v /home/kevin/hello2:/hello2 \
> ubuntu:16.04 bash

## hello1, hello2가 들어가 있다.
root@cf2be9ed3695:/# ls
bin  boot  dev  etc  hello1  hello2  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@cf2be9ed3695:/# cd hello1
root@cf2be9ed3695:/hello1# ls
test1.txt
root@cf2be9ed3695:/hello1# cd ../hello2
root@cf2be9ed3695:/hello2# ls
test2.txt

## 두개의 볼륨 확인됨
root@cf2be9ed3695:/hello1# mount
root@cf2be9ed3695:/hello1# df -ha

## container에서 내용 바꾸기
root@cf2be9ed3695:/hello1# echo "Hi~" >> test1.txt
root@cf2be9ed3695:/hello1# cat test1.txt

## 밖에서도 내용이 바뀐 것 확인 가능
kevin@hostos1:~/hello1$ cat test1.txt
test1Hi~

## mount 확인하기
kevin@hostos1:~/hello1$ docker inspect \
> --format="{{.HostConfig.Binds}}" \
> ubuntu_volume1
[/home/kevin/hello1:/hello1 /home/kevin/hello2:/hello2]
  • 데이터베이스

Database 관리
-> Master - Standby -> Active-Active, Active-Standby
-> Backup
-> Migration(이전) : *.idb(데이터를 저장한 파일)

## mysql container 실행
kevin@hostos1:~$ docker run -it --name=mydb-vol -e MYSQL_ROOT_PASSWORD=pass123# -e MYSQL_DATABASE=kakaodb -v /home/kevin/mydb:/var/lib/mysql -d mysql:5.7-debian

## 컨테이너로 들어가기
kevin@hostos1:~$ docker exec -it mydb-vol bash

## mysql 실행
root@8288b1125381:/# mysql -uroot -p
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| kakaodb            |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

mysql> use kakaodb;
mysql> create table kakao_prod (prod_name varchar(20), prod_item varchar(50));
mysql> insert into kakao_prod values ('imoticon', 'crong');
mysql> select * from kakao_prod;
+-----------+-----------+
| prod_name | prod_item |
+-----------+-----------+
| imoticon  | crong     |
+-----------+-----------+

## 파일 확인하기
root@8288b1125381:/# cd /var/lib/mysql/kakaodb/
root@8288b1125381:/var/lib/mysql/kakaodb# ls
db.opt  kakao_prod.frm  kakao_prod.ibd

kevin@hostos1:~$ cd mydb/
kevin@hostos1:~/mydb$ cd kakaodb/
-bash: cd: kakaodb/: Permission denied

## sudo로 확인한다.
kevin@hostos1:~/mydb$ sudo ls -l kakaodb/
[sudo] password for kevin:
total 112
-rw-r----- 1 systemd-coredump systemd-coredump    65  915 14:06 db.opt
-rw-r----- 1 systemd-coredump systemd-coredump  8610  915 14:07 kakao_prod.frm
-rw-r----- 1 systemd-coredump systemd-coredump 98304  915 14:07 kakao_prod.ibd

## container stop
kevin@hostos1:~/mydb$ docker stop mydb-vol
kevin@hostos1:~/mydb$ cexrm

## container를 stop해도 volume이 남아있다.
kevin@hostos1:~/mydb$ sudo ls -l kakaodb/
total 112
-rw-r----- 1 systemd-coredump systemd-coredump    65  915 14:06 db.opt
-rw-r----- 1 systemd-coredump systemd-coredump  8610  915 14:07 kakao_prod.frm
-rw-r----- 1 systemd-coredump systemd-coredump 98304  915 14:07 kakao_prod.ibd

: 데이터 영속성(지속성) 유지를 위한 볼륨 구성

Q) mysql:5.7-debian을 stop하고 rm을 한다
1. mysql:8.0으로 바꿔도 volume이 남아있을까? - yes
2. mariadb:10.2으로 바꿔도 volume이 남아있을까? - no

볼륨은 해당 컨테이터(application)의 주요 소스, 구성 경로에 배치
httpd -> /var/www/html
nginx -> /etc/nginx or /usr/hsare/nginx/html or /var/log/nginx/access.log | error.log

  • AWS cloud에서 web application은 auto scaling 그룹의 amazon ec2 인스턴스에서 실행됩니다. 장애로 인해 인스턴스가 종료되면, 종료된 인스턴스에 있는 로그는 손실되므로 systems operations 팀은 문제의 원인을 확인할 수 없습니다. 근본 원인을 어떻게 확인할 수 있습니까?
    : Amazon CloudWatch 에이전트를 Web Application에 적용하여 로그를 Amazon CloudWatch Logs로 push 한다.(또는 SQS(Amazon Simple Queue Service) 서비스 활용)

  • docker volume의 일반적인 활용 (중요 데이터 보호 -> Web 로그 분석)

## 웹 서비스 nginx의 로그 경로를 볼륨으로 호스트와 bind mount 수행
kevin@hostos1:~$ mkdir -p /home/kevin/nginx-log

## directory를 생성하지 않고 볼륨에 의해 자동으로 생성되면 소유권이 root로 된다
kevin@hostos1:~$ docker run -d -v /home/kevin/nginx-log:/var/log/nginx -p 8011:80 nginx:1.21

## 호스트에서 웹 서비스 로그 확인
kevin@hostos1:~$ cd nginx-log/
kevin@hostos1:~/nginx-log$ ls
access.log  error.log
kevin@hostos1:~/nginx-log$ tail -f access.log

## 웹 서비스 로그 분석 : 지정 범위 내의 로그시간($4) 동안 [IP 중복 건수, IP 내림차순 출력]
kevin@hostos1:~/nginx-log$ awk '$4>"[15/Sep/2022:14:28:41]" && $4<"[15/Sep/2022:14:40:30]"' access.log | awk '{print $1}' | sort | uniq -c | sort -r | more
  • file to file
## file to file container 생성
kevin@hostos1:~$ docker run -it -v /home/kevin/.bash_history:/root/.bash_history --rm centos:7 bash

## ls
[root@c5cccd3e0346 ~]# ls -al
total 44
dr-xr-x--- 1 root root    27 Sep 15 05:37 .
drwxr-xr-x 1 root root    18 Sep 15 05:37 ..
-rw------- 1 1000 1000 16437 Sep 15 02:30 .bash_history
-rw-r--r-- 1 root root    18 Dec 29  2013 .bash_logout
-rw-r--r-- 1 root root   176 Dec 29  2013 .bash_profile
-rw-r--r-- 1 root root   176 Dec 29  2013 .bashrc
-rw-r--r-- 1 root root   100 Dec 29  2013 .cshrc
-rw-r--r-- 1 root root   129 Dec 29  2013 .tcshrc
-rw------- 1 root root  3416 Nov 13  2020 anaconda-ks.cfg

## 새로운 파일 만들기
[root@c5cccd3e0346 ~]# echo 'docker file volume test' > file_volume.txt
[root@c5cccd3e0346 ~]# ls
anaconda-ks.cfg  file_volume.txt
[root@c5cccd3e0346 ~]# cat file_volume.txt
docker file volume test
[root@c5cccd3e0346 ~]# exit

## 맨 아래로 가서 확인 가능하다
kevin@hostos1:~$ vi .bash_history

container 시간 동기화
container를 생성하고 들어가면 시간이 맞지 않는다. rdate를 설치하고 싶지 않다.

kevin@hostos1:~$ docker run -it --rm centos:7 bash
[root@604d7230b1e4 /]# date
Thu Sep 15 05:40:32 UTC 2022
[root@604d7230b1e4 /]# rdate -s time.bora.net
bash: rdate: command not found

시간이 적혀 있는 파일을 mount 한다.

kevin@hostos1:~$ docker run -it --rm -v /etc/localtime:/etc/localtime centos:7 bash
[root@a228e2ed5b4c /]# date
Thu Sep 15 14:42:39 KST 2022
  • 문제점 찾기
kevin@hostos1:~$ docker run -it -v /home/kevin/webapp:/webapp --name=webapp ubuntu:14.04 bash
root@9ed21aca4c9e:/# df -h
Filesystem      Size  Used Avail Use% Mounted on
- overlay         100G  4.2G   96G   5% /
tmpfs            64M     0   64M   0% /dev
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
shm              64M     0   64M   0% /dev/shm
- /dev/sda1        73G  8.8G   61G  13% /webapp
/dev/sdb1       100G  4.2G   96G   5% /etc/hosts
tmpfs           2.0G     0  2.0G   0% /proc/acpi
tmpfs           2.0G     0  2.0G   0% /proc/scsi
tmpfs           2.0G     0  2.0G   0% /sys/firmware

: webapp 용량이 host의 /와 같다.
: 전체 공간을 이 컨테이너가 다 가질 수 있다.

  • docker container root FS quota(할당량) 제한
kevin@hostos1:~$ sudo vi /etc/default/grub
10 GRUB_CMDLINE_LINUX_DEFAULT="quiet splash rootflags=uquota, pquota"

kevin@hostos1:~$ sudo vi /etc/fstab
UUID=d8e19974-a663-4fae-bc3d-2159f8fa4538 /               ext4    defaults		  0       1
UUID=dd52a977-48e0-4abc-976c-99f7b00dfa0f /var/lib/docker xfs     defaults,pquota 0       0

kevin@hostos1:~$ sudo reboot

kevin@hostos1:~$ docker run -it -v /home/kevin/webapp:/webapp --name=webapp ubuntu:14.04 bash
kevin@hostos1:~$ df -h
  • docker volume 생성
kevin@hostos1:~$ docker volume create my-db-volume
kevin@hostos1:~$ docker volume ls
DRIVER    VOLUME NAME
...
local     my-db-volume

kevin@hostos1:~$ docker run -d --name mydb \
> -e MYSQL_ROOT_PASSWORD=password1 \
> -e MYSQL_DATABASE=wp \
> -v my-db-volume:/var/lib/mysql \
> mysql:5.7

## 볼륨 조회
kevin@hostos1:~$ docker inspect --type volume my-db-volume
[
    {
        "CreatedAt": "2022-09-15T15:40:48+09:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/my-db-volume/_data",
        "Name": "my-db-volume",
        "Options": {},
        "Scope": "local"
    }
]
kevin@hostos1:~$ docker volume inspect my-db-volume
kevin@hostos1:~$ sudo ls /var/lib/docker/volumes/my-db-volume/_data

## 볼륨 삭제
kevin@hostos1:~$ docker stop mydb
kevin@hostos1:~$ docker rm mydb
kevin@hostos1:~$ docker volume rm my-db-volume
  • application과 database가 결합된 container 결합 환경 구성
    mysql 8.0과 wordpress가 link로 연결된 multi container service 구성
## mysql_app
kevin@hostos1:~$ docker network create myapp-net
kevin@hostos1:~$ docker volume create mydb_data
kevin@hostos1:~$ docker run -itd \
> --name=mysql_app \
> -v mydb_data:/var/lib/mysql \
> --restart=always \
> -p 3306:3306 \
> --net=myapp-net \
> -e MYSQL_ROOT_PASSWORD=password# \
> -e MYSQL_DATABASE=wpdb \
> -e MYSQL_USER=wpuser \
> -e MYSQL_PASSWORD=wppassword \
> mysql:8.0

## wordpress_app
kevin@hostos1:~$ docker volume create myweb_data
kevin@hostos1:~$ docker run -itd \
> --name=wordpress_app \
> -v myweb_data:/var/www/html \
> -v ${PWD}/myweb-log:/var/log \
> --restart=always \
> -p 8888:80 \
> --net=myapp-net \
> -e WORDPRESS_DB_HOST=mysql_app:3306 \
> -e WORDPRESS_DB_NAME=wpdb \
> -e WORDPRESS_DB_USER=wpuser \
> -e WORDPRESS_DB_PASSWORD=wppassword \
> --link mysql_app:mysql \
> wordpress

## 확인하기
kevin@hostos1:~$ docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         PORTS                                                  NAMES
bcd337cb028e   wordpress   "docker-entrypoint.s…"   9 seconds ago   Up 7 seconds   0.0.0.0:8888->80/tcp, :::8888->80/tcp                  wordpress_app
3738ab1dac89   mysql:8.0   "docker-entrypoint.s…"   3 minutes ago   Up 3 minutes   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql_app

kevin@hostos1:~$ docker exec -it mysql_app bash

## http://192.168.56.101:8888/에 접속한다.
  • 3-Tier container MSA 만들기 : npm 기반의 nodejs
## bridge network 생성
kevin@hostos1:~$ docker network create devapp-net

## mongodb container 생성
kevin@hostos1:~$ docker run -d \
> --name=mongodb \
> -p 17017:27017 \
> --restart=always \
> --network=devapp-net \
> mongo:4

kevin@hostos1:~$ docker logs -f mongodb

## backend container 생성
kevin@hostos1:~$ docker run -d \
> --name=backend \
> --network=devapp-net \
> --restart=always \
> -e PORT=8000 \
> -e GUESTBOOK_DB_ADDR=mongodb:27017 \
> leecloudo/guestbook:backend_1.0

kevin@hostos1:~$ docker logs -f backend

## frontend container 생성
kevin@hostos1:~$ docker run -d \
> --name=frontend \
> -p 3000:8000 \
> --network=devapp-net \
> --restart=always \
> -e PORT=8000 \
> -e GUESTBOOK_API_ADDR=backend:8000 \
> leecloudo/guestbook:frontend_1.0

kevin@hostos1:~$ docker logs -f frontend

## web 접속 후 guestbook에 정보 입력

0개의 댓글