# curl -fsSL https://get.docker.com/ | sh
# yum -y install bash-completion wget unzip net-tools mysql telnet rdate
# rdate -s time.bora.net && clock -w
# curl https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker -o /etc/bash_completion.d/docker.sh
# systemctl enable --now docker
[root@localhost ~]# docker volume create my-vol01
my-vol01
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
local my-vol01
[root@localhost ~]# docker inspect my-vol01 //bind mount와 유사, 관리를 할 수 있음
[
{
"CreatedAt": "2022-07-13T09:46:24+09:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-vol01/_data", //경로
"Name": "my-vol01",
"Options": {},
"Scope": "local"
}
]
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
b99e293310cf bridge bridge local //bridge가 공유기 역할
a8bb609c895f host host local
cc338030dd27 none null local
[root@localhost ~]# docker inspect bridge
[
{
"Name": "bridge",
"Id": "b99e293310cfa5fea7df22494cf25f18bc04acfbbdf38df2768d75ff9ae30ae4",
"Created": "2022-07-13T09:36:10.684879046+09:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0", //실제 이름은 docker0 -> 하나의 가상 LAN 카드, 컨테이너와 연결되어 있음
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}
]
[root@localhost ~]# docker network create new-net --subnet 10.24.0.0/16 --ip-range 10.24.0.0/20 --gateway 10.24.0.1
1efbf1ba286fd5c39daacc96e7d7716c0d6221c1d0e77ec602bd26e36d61d26d
[root@localhost ~]# docker inspect new-net
[
{
"Name": "new-net",
"Id": "1efbf1ba286fd5c39daacc96e7d7716c0d6221c1d0e77ec602bd26e36d61d26d",
"Created": "2022-07-13T10:08:08.696103314+09:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "10.24.0.0/16",
"IPRange": "10.24.0.0/20",
"Gateway": "10.24.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
[root@localhost ~]# mkdir onbuild && cd $_
[root@localhost onbuild]# vi Dockerfile.base
FROM ubuntu:18.04
RUN sed -i 's/archive.ubuntu.com/ftp.daumkakao.com/g' /etc/apt/sources.list
RUN apt-get -y update
RUN apt-get -y install nginx
EXPOSE 80
ONBUILD ADD website*.tar /var/www/html/
CMD ["nginx", "-g", "daemon off;"]
[root@localhost onbuild]# docker build -t seozzang3/web-base:v2.0 -f Dockerfile.base . //seozzang3/web-base=>리포지토리 이름, :v2.0=>tag , 다합쳐서 이미지 이름
[root@localhost onbuild]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
seozzang3/web-base v2.0 4c836c760048 57 seconds ago 165MB
ubuntu 18.04 ad080923604a 5 weeks ago 63.1MB
[root@localhost onbuild]# docker login
Authenticating with existing credentials...
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[root@localhost onbuild]# docker push seozzang3/web-base:v2.0
The push refers to repository [docker.io/seozzang3/web-base]
e9144dc49637: Pushed
54a40f4a0798: Pushed
520d1697dc47: Pushed
95129a5fe07e: Layer already exists
v2.0: digest: sha256:833b266e0202c733ec5273316c91bed1fbab24355250f1eec78fbea70a5f8e13 size: 1160
[root@localhost onbuild]# vi Dockerfile
FROM seozzang3/web-base:v2.0 //메뉴얼 마냥,,,
[root@localhost onbuild]# pwd
/root/onbuild
[root@localhost onbuild]# ls
Dockerfile Dockerfile.base
[root@localhost onbuild]# ls
Dockerfile Dockerfile.base website.tar
[root@localhost onbuild]# docker build -t seozzang3/web-site:v2.0 .
Sending build context to Docker daemon 6.852MB
Step 1/1 : FROM seozzang3/web-base:v2.0
# Executing 1 build trigger
---> c813917c01ba
Successfully built c813917c01ba
Successfully tagged seozzang3/web-site:v2.0
[root@localhost onbuild]# docker run -d -p 80:80 --name=web-site seozzang3/web-site:v2.0
3ea95859c346c2d5f948d46c3cd3b9395421cb8b91d9d6b35103b0d361bae65a
[root@localhost onbuild]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3ea95859c346 seozzang3/web-site:v2.0 "nginx -g 'daemon of…" 3 seconds ago Up 2 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp web-site
docker ip인 192.168.0.188로 접속
push
[root@localhost onbuild]# docker push seozzang3/web-site:v2.0
The push refers to repository [docker.io/seozzang3/web-site]
da40fa1d5c53: Pushed
e9144dc49637: Mounted from seozzang3/web-base
54a40f4a0798: Mounted from seozzang3/web-base
520d1697dc47: Mounted from seozzang3/web-base
95129a5fe07e: Layer already exists
v2.0: digest: sha256:f1f4c66384788c1733c846c62bd21c0d958faf1e93a7d08a5d3a4b22c728417e size: 1371
#!/bin/bash
sudo amazon-linux-extras install docker -y
sudo systemctl start docker && systemctl enable docker
curl https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker -o /etc/bash_completion.d/docker.sh
sudo usermod -a -G docker ec2-user
docker run -d -p 80:80 --name=test-site seozzang3/web-site:v2.0
route53에 레코드 추가 (ec2 인스턴스 퍼블릭 ip)
만든 도메인으로 접속 (docker.hyejin36.shop)
tag
[root@localhost onbuild]# vi /etc/docker/daemon.json
{ "insecure-registries":["docker.hyejin36.shop:5000"] }
[root@localhost onbuild]# systemctl restart docker
[root@localhost onbuild]# docker tag seozzang3/web-site:v2.0 docker.hyejin36.shop:5000/web-site:v2.0
[root@localhost onbuild]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.hyejin36.shop:5000/web-site v2.0 c813917c01ba 38 minutes ago 172MB
seozzang3/web-site v2.0 c813917c01ba 38 minutes ago 172MB
seozzang3/web-base v2.0 4c836c760048 48 minutes ago 165MB
ubuntu 18.04 ad080923604a 5 weeks ago 63.1MB
[root@localhost onbuild]# docker push docker.hyejin36.shop:5000/web-site:v2.0
The push refers to repository [docker.hyejin36.shop:5000/web-site]
da40fa1d5c53: Pushed
e9144dc49637: Pushed
54a40f4a0798: Pushed
520d1697dc47: Pushed
95129a5fe07e: Pushed
v2.0: digest: sha256:f1f4c66384788c1733c846c62bd21c0d958faf1e93a7d08a5d3a4b22c728417e size: 1371
[root@localhost onbuild]# cd ~
[root@localhost ~]# curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 11.6M 100 11.6M 0 0 1673k 0 0:00:07 0:00:07 --:--:-- 2187k
[root@localhost ~]# chmod +x /usr/local/bin/docker-compose
[root@localhost ~]# mkdir my_wordpress && cd $_
[root@localhost ~]# vi docker-compose.yml
version: "3.3"
services:
dbserver:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment: // -e, 컨테이너에 저장되는 변수값
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: wppass
wordpress:
depends_on: // 우선순위: wordpress가 dbserver보다 후순위로 생성되게끔 설정, dbserver가 먼저 생성되고 wordpress랑 연결
- dbserver
image: wordpress:latest // docker image 만들어놓은것 가져오기
volumes:
- wordpress_data:/var/www/html
ports:
- "80:80" # 충돌날 수 있으니 8888로 변경
restart: always # 껐다 켜지더라도 자동으로 활성화되도록 설정
environment: # wp-config.php파일에 들어갈 정보들
WORDPRESS_DB_HOST: dbserver:3306
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: wppass
WORDPRESS_DB_NAME: wordpress
volumes: # 실제로 사용하겠다고 선언하는 부분
db_data: {}
wordpress_data: {}
[root@localhost my_wordpress]# docker-compose up -d
[root@localhost my_wordpress]# docker-compose ps
Name Command State Ports
------------------------------------------------------------------------------------
my_wordpress_dbserver_1 docker-entrypoint.sh Up 3306/tcp, 33060/tcp
mysqld
my_wordpress_wordpress_1 docker-entrypoint.sh Up 0.0.0.0:8888->80/tcp,::
apach ... :8888->80/tcp
[root@localhost my_wordpress]# docker inspect my_wordpress_db_data
[
{
"CreatedAt": "2022-07-13T12:11:38+09:00",
"Driver": "local",
"Labels": {
"com.docker.compose.project": "my_wordpress",
"com.docker.compose.version": "1.26.2",
"com.docker.compose.volume": "db_data"
},
"Mountpoint": "/var/lib/docker/volumes/my_wordpress_db_data/_data",
"Name": "my_wordpress_db_data",
"Options": null,
"Scope": "local"
}
]
[root@localhost my_wordpress]# cd /var/lib/docker/volumes/my_wordpress_db_data/_data
[root@localhost my_wordpress_db_data]# cd ~/my_wordpress/
[root@localhost my_wordpress]# ls
docker-compose.yml
[root@localhost my_wordpress]# cd /var/lib/docker/volumes/my_wordpress_wordpress_data/_data
[root@localhost _data]# ls
index.php wp-comments-post.php wp-includes wp-signup.php
license.txt wp-config-docker.php wp-links-opml.php wp-trackback.php
readme.html wp-config.php wp-load.php xmlrpc.php
wp-activate.php wp-config-sample.php wp-login.php
wp-admin wp-content wp-mail.php
wp-blog-header.php wp-cron.php wp-settings.php
[root@localhost _data]# cd ~/my_wordpress/
[root@localhost my_wordpress]# docker-compose pause
Pausing my_wordpress_dbserver_1 ... done
Pausing my_wordpress_wordpress_1 ... done
[root@localhost my_wordpress]# docker-compose unpause
Unpausing my_wordpress_wordpress_1 ... done
Unpausing my_wordpress_dbserver_1 ... done
[root@localhost my_wordpress]# docker-compose port wordpress 80
0.0.0.0:8888
[root@localhost my_wordpress]# docker-compose config
services:
dbserver:
environment:
MYSQL_DATABASE: wordpress
MYSQL_PASSWORD: wppass
MYSQL_ROOT_PASSWORD: password
MYSQL_USER: wpuser
image: mysql:5.7
restart: always
volumes:
- db_data:/var/lib/mysql:rw
wordpress:
depends_on:
- dbserver
environment:
WORDPRESS_DB_HOST: dbserver:3306
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_PASSWORD: wppass
WORDPRESS_DB_USER: wpuser
image: wordpress:latest
ports:
- published: 8888
target: 80
restart: always
volumes:
- wordpress_data:/var/www/html:rw
version: '3.3'
volumes:
db_data: {}
wordpress_data: {}
[root@localhost my_wordpress]# docker-compose stop wordpress
Stopping my_wordpress_wordpress_1 ... done
[root@localhost my_wordpress]# docker-compose ps
Name Command State Ports
------------------------------------------------------------------------------------
my_wordpress_dbserver_1 docker-entrypoint.sh Up 3306/tcp, 33060/tcp
mysqld
my_wordpress_wordpress_1 docker-entrypoint.sh apach Exit 0
...
[root@localhost my_wordpress]# docker-compose rm wordpress
Going to remove my_wordpress_wordpress_1
Are you sure? [yN] y
Removing my_wordpress_wordpress_1 ... done
[root@localhost my_wordpress]# docker-compose down
Stopping my_wordpress_dbserver_1 ... done
Removing my_wordpress_dbserver_1 ... done
Removing network my_wordpress_default
[root@localhost my_wordpress]# docker-compose ps
Name Command State Ports
------------------------------
[root@localhost my_wordpress]# docker-compose down
Stopping my_wordpress_wordpress_1 ... done
Stopping my_wordpress_dbserver_1 ... done
Removing my_wordpress_wordpress_1 ... done
Removing my_wordpress_dbserver_1 ... done
Removing network my_wordpress_default
[root@localhost my_wordpress]# docker-compose ps
Name Command State Ports
------------------------------
[root@localhost my_wordpress]# docker-compose up -d
Creating network "my_wordpress_default" with the default driver
Creating my_wordpress_dbserver_1 ... done
Creating my_wordpress_wordpress_1 ... done
[root@localhost my_wordpress]# docker-compose down -v //-v를 넣으면 container, volume 다 삭제
Stopping my_wordpress_wordpress_1 ... done
Stopping my_wordpress_dbserver_1 ... done
Removing my_wordpress_wordpress_1 ... done
Removing my_wordpress_dbserver_1 ... done
Removing network my_wordpress_default
Removing volume my_wordpress_db_data
Removing volume my_wordpress_wordpress_data
[root@localhost my_wordpress]# docker-compose down --rmi all
Removing network my_wordpress_default
WARNING: Network my_wordpress_default not found.
Removing image mysql:5.7
Removing image wordpress:latest
yml파일 있는 곳에서 docker-compose 실행해야 함
[root@localhost my_wordpress]# docker stats web-site
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
3ea95859c346 web-site 0.00% 2.371MiB / 3.7GiB 0.06% 656B / 0B 0B / 0B 3
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
3ea95859c346 web-site 0.00% 2.371MiB / 3.7GiB 0.06% 656B / 0B 0B / 0B 3
[root@localhost my_wordpress]# VERSION=v0.44.0
[root@localhost my_wordpress]# docker run \
> --volume=/:/rootfs:ro \
> --volume=/var/run:/var/run:ro \
> --volume=/sys:/sys:ro \
> --volume=/var/lib/docker/:/var/lib/docker:ro \
> --volume=/dev/disk/:/dev/disk:ro \
> --publish=8080:8080 \
> --detach=true \
> --name=cadvisor \
> --privileged \
> --device=/dev/kmsg \
> gcr.io/cadvisor/cadvisor:$VERSION
Unable to find image 'gcr.io/cadvisor/cadvisor:v0.44.0' locally
v0.44.0: Pulling from cadvisor/cadvisor
8572bc8fb8a3: Pull complete
767fa50f0abb: Pull complete
ea01cc345381: Pull complete
292822dcb406: Pull complete
fe825e66ed0f: Pull complete
Digest: sha256:ef1e224267584fc9cb8d189867f178598443c122d9068686f9c3898c735b711f
Status: Downloaded newer image for gcr.io/cadvisor/cadvisor:v0.44.0
839c0bfeb59bdd2ba7639c3fdb00dd21f8a842432a5f40903f483bc88f1274cf
# hostnamectl set-hostname master1
# cat <<EOF >> /etc/hosts
192.168.0.188 manager1
192.168.1.129 worker1
192.168.1.149 worker2
EOF
[root@master1 ~]# docker swarm init --advertise-addr 192.168.0.188
Swarm initialized: current node (gjfe1r20f7c95wi7aoax5d21p) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-59mjzyl0ao7k8h8ge905rjusulbcwxwk01em24zlplpuf5p4cw-ahom04ogjauemo2x5cnz3k1sb 192.168.0.188:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
[root@worker1 ~]# docker swarm join --token SWMTKN-1-59mjzyl0ao7k8h8ge905rjusulbcwxwk01em24zlplpuf5p4cw-ahom04ogjauemo2x5cnz3k1sb 192.168.0.188:2377
This node joined a swarm as a worker.
[root@worker2 ~]# docker swarm join --token SWMTKN-1-59mjzyl0ao7k8h8ge905rjusulbcwxwk01em24zlplpuf5p4cw-ahom04ogjauemo2x5cnz3k1sb 192.168.0.188:2377
This node joined a swarm as a worker.
[root@master1 ~]# docker service create --name my_web --replicas 3 --publish published=8080,target=80 nginx
clwr4uwdhqrgrx0iw8y0lf50p
overall progress: 3 out of 3 tasks
1/3: running
2/3: running
3/3: running
verify: Service converged
최소단위를 컨테이너가 아닌 task로,,,
192.168.0.188:8080으로 접속
각각의 노드로 접속 가능
# docker node ls
# docker service ps my_web
# docker node update --availability drain worker1
# docker node inspect --pretty worker1
# docker service ps my_web
# docker node update --availability active worker1
# docker service scale my_web=2
# docker service scale my_web=3
# docker node inspect --pretty worker1
# docker node update --availability pause worker2
# docker service scale my_web=5
# docker node inspect --pretty worker2
# docker node ls