rapa@rapa:~/0822$ vi docker-compose.yml
version: '3.7'
services:
web:
image: httpd
ports:
- "8001:80"
command: httpd -D FOREGROUND
depends_on:
- db
links:
- db:mysql
db:
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=test123
- MYSQL_DATABASE=testdb
rapa@rapa:~/0822$ dc up -d
Creating network "0822_default" with the default driver
Creating 0822_db_1 ... done
Creating 0822_web_1 ... done
-> -d: 백그라운드에서 돌릴 것임
-> 자동으로 별도의 네트워크가 만들어짐(0822_default). 디렉토리의 이름이 앞에 붙음.
-> 별도의 네트워크를 위한 기본 네트워크가 생성되고 컨테이너도 생성된다.
rapa@rapa:~/0822$ dc ps
Name Command State Ports
---------------------------------------------------------------------------------------
0822_db_1 docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp
0822_web_1 httpd -D FOREGROUND Up 0.0.0.0:8001->80/tcp,:::8001->80/tcp
-> docker-compose로 만든 컨테이너만을 확인한다.
rapa@rapa:~/0822$ dc scale web=2
WARNING: The scale command is deprecated. Use the up command with the --scale flag instead.
WARNING: The "web" service specifies a port on the host. If multiple containers for this service are created on a single host, the port will clash.
Creating 0822_web_2 ...
Creating 0822_web_2 ... error
ERROR: for 0822_web_2 Cannot start service web: driver failed programming external connectivity on endpoint 0822_web_2 (6aae683dd62882304babb810746ad7f667e36f61d9ffe10a05564fb30dfb4bee): Bind for 0.0.0.0:8001 failed: port is already allocated
ERROR: Cannot start service web: driver failed programming external connectivity on endpoint 0822_web_2 (6aae683dd62882304babb810746ad7f667e36f61d9ffe10a05564fb30dfb4bee): Bind for 0.0.0.0:8001 failed: port is already allocated
-> 8001번 포트가 중복되기 때문에 오류 발생
rapa@rapa:~/0822$ vi docker-compose.yml
ports:
- "8001-8002:80"
rapa@rapa:~/0822$ dc scale web=2
WARNING: The scale command is deprecated. Use the up command with the --scale flag instead.
WARNING: The "web" service specifies a port on the host. If multiple containers for this service are created on a single host, the port will clash.
Creating 0822_web_2 ... done
rapa@rapa:~/0822$ dc ps
Name Command State Ports
---------------------------------------------------------------------------------------
0822_db_1 docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp
0822_web_1 httpd -D FOREGROUND Up 0.0.0.0:8001->80/tcp,:::8001->80/tcp
0822_web_2 httpd -D FOREGROUND Up 0.0.0.0:8002->80/tcp,:::8002->80/tcp
-> 8001번 포트, 8002번 포트가 각각 할당되었음
rapa@rapa:~/0822$ vi docker-compose.yml
ports:
- "80"
rapa@rapa:~/0822$ dc up -d
0822_db_1 is up-to-date
Stopping and removing 0822_web_2 ... done
Recreating 0822_web_1 ... done
-> db는 변경 사항이 없음
rapa@rapa:~/0822$ dc ps
Name Command State Ports
-----------------------------------------------------------------------------------------
0822_db_1 docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp
0822_web_1 httpd -D FOREGROUND Up 0.0.0.0:49153->80/tcp,:::49153->80/tcp
호스트의 랜덤 포트(49153번) 포트로 할당되었음
rapa@rapa:~/0822$ dc scale web=3
WARNING: The scale command is deprecated. Use the up command with the --scale flag instead.
Creating 0822_web_2 ... done
Creating 0822_web_3 ... done
Name Command State Ports
-----------------------------------------------------------------------------------------
0822_db_1 docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp
0822_web_1 httpd -D FOREGROUND Up 0.0.0.0:49153->80/tcp,:::49153->80/tcp
0822_web_2 httpd -D FOREGROUND Up 0.0.0.0:49154->80/tcp,:::49154->80/tcp
0822_web_3 httpd -D FOREGROUND Up 0.0.0.0:49155->80/tcp,:::49155->80/tcp
rapa@rapa:~/0822$ dc scale web=1
WARNING: The scale command is deprecated. Use the up command with the --scale flag instead.
Stopping and removing 0822_web_2 ... done
Stopping and removing 0822_web_3 ... done
rapa@rapa:~/0822$ dc ps
Name Command State Ports
-----------------------------------------------------------------------------------------
0822_db_1 docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp
0822_web_1 httpd -D FOREGROUND Up 0.0.0.0:49153->80/tcp,:::49153->80/tcp
rapa@rapa:~/0822$ mkdir test1
rapa@rapa:~/0822$ cd test1
rapa@rapa:~/0822/test1$ cp ../docker-compose.yml .
rapa@rapa:~/0822/test1$ tree
.
└── docker-compose.yml
0 directories, 1 file
rapa@rapa:~/0822/test1$ dc up -d
Creating network "test1_default" with the default driver
Creating test1_db_1 ... done
Creating test1_web_1 ... done
rapa@rapa:~/0822/test1$ dc ps
Name Command State Ports
------------------------------------------------------------------------------------------
test1_db_1 docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp
test1_web_1 httpd -D FOREGROUND Up 0.0.0.0:49156->80/tcp,:::49156->80/tcp
-> 현 디렉토리에서 생성된 컨테이너만 보여짐
rapa@rapa:~/0822/test1$ docker network ls
NETWORK ID NAME DRIVER SCOPE
de17d02308c9 0822_default bridge local
9a903e5720fe bridge bridge local
3ead376f089f host host local
39430d1f4412 none null local
b49ee53043bc test1_default bridge local
-> 0822_default, test1_default 네트워크가 생성되었다.
rapa@rapa:~/0822/test1$ docker network inspect 0822_default | grep Subnet
"Subnet": "172.20.0.0/16",
rapa@rapa:~/0822/test1$ docker network inspect test1_default | grep Subnet
"Subnet": "172.21.0.0/16",
-> 서로 다른 대역으로 네트워크가 생성되었다.
rapa@rapa:~/0822/test1$ dc -p 0822 ps
Name Command State Ports
-----------------------------------------------------------------------------------------
0822_db_1 docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp
0822_web_1 httpd -D FOREGROUND Up 0.0.0.0:49153->80/tcp,:::49153->80/tcp
-> 해당 디렉토리에 있는 컨테이너를 확인
rapa@rapa:~/0822/test1$ dc -p 0822 down
Stopping 0822_web_1 ... done
Stopping 0822_db_1 ... done
Removing 0822_web_1 ... done
Removing 0822_db_1 ... done
Removing network 0822_default
rapa@rapa:~/0822/test1$ dc down
Stopping test1_web_1 ... done
Stopping test1_db_1 ... done
Removing test1_web_1 ... done
Removing test1_db_1 ... done
Removing network test1_default
rapa@rapa:~/0822/test1$ docker network create test1net
588c90a886469b05ad1016576ac637238a12ce541dcb12f9ca9f7ed5343ec45e
rapa@rapa:~/0822/test1$ docker container run -it \
> --name centos01 \
> --net test1net \
> centos:7
[root@b71c60f5dbf5 /]#
[root@b71c60f5dbf5 /]# ping www.google.com -c 3
PING www.google.com (142.250.199.100) 56(84) bytes of data.
64 bytes from nrt13s52-in-f4.1e100.net (142.250.199.100): icmp_seq=1 ttl=109 time=32.3 ms
64 bytes from nrt13s52-in-f4.1e100.net (142.250.199.100): icmp_seq=2 ttl=109 time=29.7 ms
64 bytes from nrt13s52-in-f4.1e100.net (142.250.199.100): icmp_seq=3 ttl=109 time=30.6 ms
--- www.google.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 29.777/30.957/32.398/1.085 ms
# ctrl + p. q 로 콘솔 빠져나옴
rapa@rapa:~/0822/test1$ docker container ls --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b71c60f5dbf5 centos:7 "/bin/bash" About a minute ago Up About a minute centos01
rapa@rapa:~/0822/test1$ docker container inspect centos01 | grep NetworkMode
"NetworkMode": "test1net",
rapa@rapa:~/0822/test1$ vi docker-compose.yml
version: '3.7'
services:
web:
image: httpd
ports:
- "80"
command: httpd -D FOREGROUND
depends_on:
- db
links:
- db:mysql
networks:
- test1net
db:
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=test123
- MYSQL_DATABASE=testdb
networks:
- test1net
networks:
test1net:
external: true
-> 새로 test1_test1net이 만들어지지 않고, 기존에 생성혰던 네트워크 사용 (test1net)
rapa@rapa:~/0822/test1$ dc up -d
Creating test1_db_1 ... done
Creating test1_web_1 ... done
rapa@rapa:~/0822/test1$ docker container inspect test1_web_1 | grep NetworkMode
"NetworkMode": "test1net",
rapa@rapa:~/0822/test1$ docker container inspect test1_db_1 | grep NetworkMode
"NetworkMode": "test1net",
-> 새로운 네트워크가 생성되지 않았고 기존에 만들었던 teset1net과 연결되었음
volumes:
- testvolume1:/var/www/html
-> 0822_testvolume1과 컨테이너의 /var/www/html이 연결
volumes:
testvolume1:
external: true
-> 기존에 만들어 둔 testvolume1을 사용한다.
rapa@rapa:~/0822/test1$ vi docker-compose.yml
version: '3.7'
services:
web:
image: httpd
ports:
- "80"
command: httpd -D FOREGROUND
depends_on:
- db
links:
- db:mysql
networks:
- test1net
volumes:
- testvol1:/usr/local/apache2/htdocs
db:
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=test123
- MYSQL_DATABASE=testdb
networks:
- test1net
networks:
test1net:
external: true
volumes:
testvol1:
rapa@rapa:~/0822/test1$ dc up -d
Creating volume "test1_testvol1" with default driver
test1_db_1 is up-to-date
Recreating c62f3aebef49_test1_web_1 ... done
rapa@rapa:~/0822/test1$ docker volume ls
local test1_testvol1
version: '3.7'
services:
web:
image: httpd
ports:
- "80"
command: httpd -D FOREGROUND
depends_on:
- db
links:
- db:mysql
networks:
- test1net
volumes:
- testvol2:/usr/local/apache2/htdocs
db:
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=test123
- MYSQL_DATABASE=testdb
networks:
- test1net
networks:
test1net:
external: true
volumes:
testvol2:
external: true
rapa@rapa:~/0822/test1$ docker volume create testvol2
testvol2
rapa@rapa:~/0822/test1$ dc down
Stopping test1_web_1 ... done
Stopping test1_db_1 ... done
Removing test1_web_1 ... done
Removing test1_db_1 ... done
Network test1net is external, skipping
rapa@rapa:~/0822/test1$ dc up -d
Creating volume "test1_testvol2" with default driver
Creating test1_db_1 ... done
Creating test1_web_1 ... done
volume 사용은
1. nfs: 디렉토리 마운트
2. iSCSI: 스토리지에서 volume을 생성하고 이를 컨테이너의 /dev/sda* 과 같은 형태로 연결
3. tmpfs: 디스크가 아니라 RAM에 저장(영구 보관 불가)
rapa@rapa:~/0822/test1$ tree
.
├── docker-compose.yml
└── shared
└── test.txt
rapa@rapa:~/0822/test1$ vi docker-compose.yml
version: '3.7'
services:
web:
image: httpd
ports:
- "80"
command: httpd -D FOREGROUND
depends_on:
- db
links:
- db:mysql
networks:
- test1net
volumes:
- testvol2:/usr/local/apache2/htdocs
- /home/rapa/0822/test1/shared:/root
db:
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=test123
- MYSQL_DATABASE=testdb
networks:
- test1net
networks:
test1net:
external: true
volumes:
testvol2:
external: true
rapa@rapa:~/0822/test1$ dc up -d
test1_db_1 is up-to-date
Recreating test1_web_1 ... done
rapa@rapa:~/0822/test1$ docker container exec test1_web_1 ls /root
test.txt
rapa@rapa:~/0822/test1$ touch shared/ddd.txt
rapa@rapa:~/0822/test1$ docker container exec test1_web_1 ls /root
ddd.txt
test.txt
rapa@rapa:~/0822/test2$ vi docker-compose.yml
version: '3.7'
services:
web:
extends:
file: extend-compose.yml
service: testweb
rapa@rapa:~/0822/test2$ vi extend-compose.yml
version: '3.7'
services:
testweb:
image: httpd
ports:
- "80"
rapa@rapa:~/0822/test2$ dc -f docker-compose.yml -f extend-compose.yml up -d
Creating network "test2_default" with the default driver
Creating test2_web_1 ... done
Creating test2_testweb_1 ... done
rapa@rapa:~/0822/test2$ dc ps
Name Command State Ports
-------------------------------------------------------------------------------
test2_web_1 httpd-foreground Up 0.0.0.0:49161->80/tcp,:::49161->80/tcp
-> 웹이 배포되었음
rapa@rapa:~/0822/test2$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
537a781b3780 httpd "httpd-foreground" About a minute ago Up About a minute 0.0.0.0:49162->80/tcp, :::49162->80/tcp test2_testweb_1
a24dfcf0a809 httpd "httpd-foreground" About a minute ago Up About a minute 0.0.0.0:49161->80/tcp, :::49161->80/tcp test2_web_1
rapa@rapa:~/0822/test2$ dc down
Stopping test2_web_1 ... done
WARNING: Found orphan containers (test2_testweb_1) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
Removing test2_web_1 ... done
Removing network test2_default
ERROR: error while removing network: network test2_default id 5bd52c78f463e1968fd2e0528bacb0e96b5aa73dcae2e19ce51dd4a6c06d1acc has active endpoints
미리 생성해 둔 네트워크(test1net), 볼륨(testvol3)을 활용하여 외부에 워드프레스 서비스를 제공한다. 단, db의 /var/lib/mysql 은 testvol2에 마운트 된다. 또한 워드프레스는 외부 노출 시 8001-8009를 활용한다.
rapa@rapa:~/0822/wordpress$ docker volume create testvol3
testvol3
rapa@rapa:~/0822/wordpress$ vi docker-compose.yml
version: '3.7'
services:
wordpress:
image: wordpress
networks:
- test1net
links:
- "db:mysql"
ports:
- "8001-8009:80"
depends_on:
- db
environment:
- WORDPRESS_DB_PASSWORD=test123
- WORDPRESS_DB_USER=root
- WORDPRESS_DB_NAME=testdb
volumes:
- ./www:/var/www/html
db:
image: mysql:5.7
networks:
- test1net
volumes:
- testvol3:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=test123
- MYSQL_DATABASE=testdb
networks:
test1net:
external: true
volumes:
testvol3:
external: true
rapa@rapa:~/0822/wordpress$ dc up -d --scale wordpress=2
Creating wordpress_db_1 ... done
WARNING: The "wordpress" service specifies a port on the host. If multiple containers for this service are created on a single host, the port will clash.
Creating wordpress_wordpress_1 ... done
Creating wordpress_wordpress_2 ... done
rapa@rapa:~/0822/wordpress$ dc ps
Name Command State Ports
-----------------------------------------------------------------------------------------------------
wordpress_db_1 docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp
wordpress_wordpress_1 docker-entrypoint.sh apach ... Up 0.0.0.0:8005->80/tcp,:::8005->80/tcp
wordpress_wordpress_2 docker-entrypoint.sh apach ... Up 0.0.0.0:8004->80/tcp,:::8004->80/tcp
-> 8004, 8005
8004 포트 접속
8005 포트 접속
-> 8004로 리다이렉트 됨
rapa@rapa:~/0822/wordpress/www$ dc down
Stopping wordpress_wordpress_2 ... done
Stopping wordpress_wordpress_1 ... done
Stopping wordpress_db_1 ... done
Removing wordpress_wordpress_2 ... done
Removing wordpress_wordpress_1 ... done
Removing wordpress_db_1 ... done
Network test1net is external, skipping
web:
image: testweb:1.0
environment:
- DB_NAME=testdb
- DB_USER=root
- DB_PASSWORD=test123
db:
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=test123
- MYSQL_DATABASE=testdb
나중에 docker container exec testlab1_web_1 env 입력하면 위의 정보가 보여야 함
web은 외부 노출 시 자신의 80번 포트를 호스트의 8881-8889를 사용한다.
web과 db 모두 testnetwork1에 연결되어야 한다. 또한 생성된 컨테이너는 linux 재부팅 시 자동으로 활성화되어야 한다.
db는 미리 생성해 두었던 testvolume1에 연결되어야 하는데, /var/lib/mysql로 마운트된다.
rapa@rapa:~/0822/testlab$ docker volume create testvolume1
testvolume1
rapa@rapa:~/0822/testlab$ docker network create testnetwork1
78e5b3d9d96ca0b621dad37123955f5d628ef1942c90eed5f9139936973b478a
rapa@rapa:~/0822/testlab$ curl https://www.naver.com > index.html
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 247k 0 247k 0 0 1794k 0 --:--:-- --:--:-- --:--:-- 1781k
rapa@rapa:~/0822/testlab$ vi Dockerfile
FROM ubuntu:18.04
RUN apt-get update
RUN apt-get -y install nginx
ADD index.html /var/www/html/index.html
EXPOSE 80
CMD nginx -g 'daemon off;'
rapa@rapa:~/0822/testlab$ docker build -t testweb:1.0 .
Successfully built 00db770b08de
Successfully tagged testweb:1.0
rapa@rapa:~/0822/testlab$ vi docker-compose.yml
version: '3.7'
services:
web:
image: testweb:1.0
environment:
- DB_NAME=testdb
- DB_USER=root
- DB_PASSWORD=test123
networks:
- testnetwork1
ports:
- "8881:8889:80"
depends_on:
- db
links:
- db:mysql
restart: always
db:
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=test123
- MYSQL_DATABASE=testdb
networks:
- testnetwork1
volumes:
- testvolume1:/var/lib/mysql
restart: always
networks:
testnetwork1:
external: true
volumes:
testvolume1:
external: true
rapa@rapa:~/0822/testlab$ dc up -d
Creating testlab_db_1 ... done
Creating testlab_web_1 ... done
rapa@rapa:~/0822/testlab$ docker container run -d \
> -v /:/rootfs:ro \
> -v /var/run:/var/run:rw \
> -v /sys:/sys:ro \
> -v /var/lib/docker/:/var/lib/docker:ro \
> -p 9559:8080 \
> --name cadvisor \
> --net testnetwork1 \
> google/cadvisor
Unable to find image 'google/cadvisor:latest' locally
latest: Pulling from google/cadvisor
ff3a5c916c92: Pull complete
44a45bb65cdf: Pull complete
0bbe1a2fe2a6: Pull complete
Digest: sha256:815386ebbe9a3490f38785ab11bda34ec8dacf4634af77b8912832d4f85dca04
Status: Downloaded newer image for google/cadvisor:latest
78241980658fefa999e80a21c723b920cdaa2ee27ed88f4201a6725779fe2a2b
rapa@rapa:~/0822/testlab$ dc ps
Name Command State Ports
---------------------------------------------------------------------------------------------
testlab_db_1 docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp
testlab_web_1 /bin/sh -c nginx -g 'daemo ... Up 0.0.0.0:8889->80/tcp,:::8889->80/tcp
-> 웹서버 포트: 8889
localhost:8889 접속
localhost:9559 접속 (cAdvisor)
-> testlab_web_1, testlab_db_1이 보인다.
EKS/ECS/GKE
출처: https://appfleet.com/blog/top-10-container-orchestration-tools/
구성 사항:
CPU RAM NIC(VMnet10)
manager(private-registry) 2 4 211.183.3.100
worker1 2 2 211.183.3.101
worker2 2 2 211.183.3.102
worker3 2 2 211.183.3.103