root@ubuntu:/docker# docker run -dp 5000:5000 --name pregistry registry
registry 라는 이름의 이미지로 pregistry 라는 컨테이너 생성
root@ubuntu:/docker# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
d73436b0e9ec registry "/entrypoint.sh /etc…" 10 seconds ago Up 9 seconds
0.0.0.0:5000->5000/tcp, :::5000->5000/tcp pregistry
root@ubuntu:/docker# mkdir regi/
로컬 저장 디렉토리 생성
root@ubuntu:/docker# cd regi/
root@ubuntu:/docker/regi# vi Dockerfile
간단한 도커파일 작성
root@ubuntu:/docker/regi# docker build -t localhost:5000/my_nginx:1.0 .
빌드 진행
<docker file>
**************************************************************************************************
FROM nginx
**************************************************************************************************
root@ubuntu:/docker/regi# docker image ls
root@ubuntu:/docker/regi# docker push localhost:5000/my_nginx:1.0
***
The push refers to repository [localhost:5000/my_nginx]
7b72d5d921cb: Pushed
aa3739f310f5: Pushed
6906edffc609: Pushed
f88642d922a1: Pushed
2842e5d66803: Pushed
b5ebffba54d3: Pushed
1.0: digest: sha256:d5e4095bb4bcd2c40d6aba552f9ea66aacb1d0a5137a521dc6b0503b40b08921
size: 1570
***
root@ubuntu:/docker/regi# docker image rm -f localhost:5000/my_nginx:1.0
Untagged: localhost:5000/my_nginx:1.0
Untagged:
localhost:5000/my_nginx@sha256:d5e4095bb4bcd2c40d6aba552f9ea66aacb1d0a5137a521dc6b05
03b40b08921
root@ubuntu:/docker/regi# docker run -dp 777:80 --name my_nginx localhost:5000/my_nginx:1.0
Unable to find image 'localhost:5000/my_nginx:1.0' locally
1.0: Pulling from my_nginx
Digest: sha256:d5e4095bb4bcd2c40d6aba552f9ea66aacb1d0a5137a521dc6b0503b40b08921
Status: Downloaded newer image for localhost:5000/my_nginx:1.0
51e5e81a7e8bf5a2c5c2c60bbce262be99614e0d755f7e99d60e8550b0e858d3
clone Ubuntu를 하나 생성해서 docker 를 설치하고 주소는 211.183.3.110 으로 하여 현재 구성된 사설 저장소에 간단한 my_httpd:1.0 이미지를 push 해보자!
<Ubuntu clone> - curl 명령어를 사용해 Docker 엔진 설치
root@ubuntu:/docker# vi Dockerfile
<docker file>
**************************************************************************************************
FROM httpd:latest
*************************************************************************************************
root@ubuntu:/docker# docker build -t 211.183.3.100:5000/httpd:1.0 .
빌드 진행
<http 에러가 발생할 경우에 json 파일 작성>
root@ubuntu:/docker# vi /etc/docker/daemon.json
*************************************************************************************************
{
"insecure-registries": ["211.183.3.100:5000"]
}
*************************************************************************************************
root@ubuntu:/docker# systemctl restart docker
json 파일 작성후 docker 재시작
root@ubuntu:/docker# docker push 211.183.3.100:5000/httpd:1.0
<이미지, 컨테이너 삭제>
*************************************************************************************************
root@ubuntu:/docker/regi# docker rm -f $(docker ps -qa)
root@ubuntu:/docker/regi# docker image rm -f $(docker image ls -q)
*************************************************************************************************
root@ubuntu:/docker# cd /compose/
root@ubuntu:/compose# vi docker-compose.yml
yaml 파일 작성 파일명은 docker-compose.yml 이어야 한다
*************************************************************************************************
version: "3"
services:
my_nginx: #컨테이너 이름
image: nginx # 베이스 이미지
ports:
- "7676:80" # 포트지정
*************************************************************************************************
root@ubuntu:/compose# docker-compose up -d
docker compose 명령어를 실행 시키기 위한 명령어
root@ubuntu:/compose# curl localhost:7676
테스트
root@ubuntu:/compose# docker-compose ps
compose 가 실행되고 있는지 확인하는 명령어 docker ps -a 와 비슷한 의미를 가진다
root@ubuntu:/compose# docker-compose down
docker compose를 지우는 명령어
<docker-compose.yml>
*************************************************************************************************
version: "3"
services:
my_nginx:
image: nginx
ports:
- "7777:80" # 포트번호만 변경해줬음
volumes:
- "/data:/usr/share/nginx/html"
*************************************************************************************************
root@ubuntu:/compose# docker-compose up -d
<echo 를 이용한 테스트>
root@ubuntu:/compose# mkdir data
root@ubuntu:/compose# touch index.html
root@ubuntu:/compose# echo hello > index.html
root@ubuntu:/compose# mv index.html /data
root@ubuntu:/compose# ls
data docker-compose.yml
root@ubuntu:/compose# docker-compose up -d
Recreating compose_my_nginx_1 ... done
root@ubuntu:/compose# curl localhost:7575
hello
root@ubuntu:/compose# vi docker-compose.yml
root@ubuntu:/compose# docker-compose up -d
Recreating compose_my_nginx_1 ... done
root@ubuntu:/compose# curl localhost:7777
hello
<docker-compose.yml>
*************************************************************************************************
version: "3"
services:
my_nginx:
image: nginx
ports:
- "7777:80"
volumes:
- "/data:/usr/share/nginx/html"
build: .
*************************************************************************************************
root@ubuntu:/compose# vi db_Dockerfile
<docker 파일 생성>
*************************************************************************************************
FROM nginx
*************************************************************************************************
root@ubuntu:/compose# docker-compose down
Stopping compose_my_nginx_1 ... done
Removing compose_my_nginx_1 ... done
Removing network compose_default
root@ubuntu:/compose# docker-compose up -d
Creating network "compose_default" with the default driver
Creating compose_my_nginx_1 ... done
db 컨테이너와 nginx 와 링크 맺기
아직 db 컨테이너가 생성 안된 상태이기 때문에 up 을 하면 오류를 뿜을 것이다.
up 명령어는 yml 파일을 위에서 아래 방향으로 실행시키기 때문이다.
따라서, '의존성'을 db 컨테이너와 맺어줘야 한다.
<docker-compose.yml 파일>
version: "3"
services:
my_nginx:
image: nginx
ports:
- "7777:80"
volumes:
- "/data:/usr/share/nginx/html"
build:
context: .
dockerfile: db-Dockerfile
expose:
- "80"
links: # db와 연결
- "db"
depends_on: # 의존성 옵션
- "db"
db: # 새로운 db 컨테이너
image: mariadb
root@ubuntu:/compose# docker-compose up -d
Creating compose_db_1 ... done #의존성 걸려있어 먼저 생성
Recreating compose_my_nginx_1 ... done
<docker-compose.yml 파일>
version: "3"
services:
my_nginx:
image: nginx
ports:
- "7575:80"
volumes:
- "/data:/usr/share/nginx/html"
build:
context: .
dockerfile: Dockerfile
expose:
- "80"
links:
- "db"
depends_on:
- "db"
db:
image: mariadb
environment:
MYSQL_ROOT_PASSWORD: "1234"
wordpress를 docker-compose 파일로 구성해보세요.
211.183.3.100:7777로 접속했을 때 접속이 되도록
워드프레스 컨테이너 이름 : wp
mariadb 컨테이너 이름 : db
호스트의 /mdb에 mariadb 컨테이너의 DB 정보가 보존되어야 한다.
< docker-compose.yml>
version: "3"
services:
wp:
image: wordpress
ports:
- "7777:80"
expose:
- "80"
links:
- "db"
depends_on:
- "db"
environment:
WORDPRESS_DB_HOST: "db"
WORDPRESS_DB_USER: "wpuser"
WORDPRESS_DB_PASSWORD: "1234"
WORDPRESS_DB_NAME: "wordpress"
db:
image: mariadb
volumes:
- "/mdb:/var/lib/mysql"
environment:
MYSQL_ROOT_PASSWORD: "1234"
MYSQL_DATABASE: "wordpress"
MYSQL_USER: "wpuser"
MYSQL_PASSWORD: "1234"
root@ubuntu:/compose# docker-compose up -d
root@ubuntu:/docker# mkdir scale
root@ubuntu:/docker# cd scale/
root@ubuntu:/docker/scale# vi docker-compose.yml
<docker-compose.yml>
*************************************************************************************************
version: "3"
services:
srv_a:
image: nginx
srv_b:
image: redis
*************************************************************************************************
root@ubuntu:/docker/scale# docker-compose up -d
root@ubuntu:/docker/scale# docker-compose ps
Name Command State Ports
-----------------------------------------------------------------
scale_srv_a_1 /docker-entrypoint.sh ngin ... Up 80/tcp
scale_srv_b_1 docker-entrypoint.sh redis ... Up 6379/tcp
root@ubuntu:/docker/scale# docker-compose up --scale srv_a=3 -d
Starting scale_srv_a_1 ...
Starting scale_srv_a_1 ... done
Creating scale_srv_a_2 ... done
Creating scale_srv_a_3 ... done
root@ubuntu:/docker/scale# docker-compose ps
Name Command State Ports
-----------------------------------------------------------------
scale_srv_a_1 /docker-entrypoint.sh ngin ... Up 80/tcp
scale_srv_a_2 /docker-entrypoint.sh ngin ... Up 80/tcp
scale_srv_a_3 /docker-entrypoint.sh ngin ... Up 80/tcp
scale_srv_b_1 docker-entrypoint.sh redis ... Up 6379/tcp
root@ubuntu:/docker/scale# docker-compose up --scale srv_a=1 -d
scale_srv_b_1 is up-to-date
Stopping and removing scale_srv_a_2 ... done
Stopping and removing scale_srv_a_3 ... done
Starting scale_srv_a_1 ... done
root@ubuntu:/docker/scale# docker-compose ps
Name Command State Ports
-----------------------------------------------------------------
scale_srv_a_1 /docker-entrypoint.sh ngin ... Up 80/tcp
scale_srv_b_1 docker-entrypoint.sh redis ... Up 6379/tcp
manager
ip 211.183.3.200 hostname manager
worker1
ip 211.183.3.210 hostname worker1
worker2
ip 211.183.3.220 hostname worker2
hostnamectl set-hostname <호스트네임>
hostname 명령어 적용 후 적용됐는지 확인
IP 바꾸는 법
sudo vi/etc/netplan/00-installer-config.yaml
<Go to manager>
root@manager:~# docker swarm init
Swarm initialized: current node (smqycb25imit8o0hia9lzebpj) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token
SWMTKN-1-2hsluzdd6wrbfq88dulyduanz99f36w4cafdts2zl72hc5lgf3-7ll4snbtlfnfg37t16fkl8pb7
211.183.3.200:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
<도커 포트는 2377>
<복사해두기>
복사해둔 토큰을 worker1 , woker2 에 붙여넣으면 docker swarm 에 접속가능 하다.
*************************************************************************************************
root@worker1:~# docker swarm join --token
SWMTKN-1-2hsluzdd6wrbfq88dulyduanz99f36w4cafdts2zl72hc5lgf3-7ll4snbtlfnfg37t16fkl8pb7
211.183.3.200:2377
This node joined a swarm as a worker.
*************************************************************************************************
root@manager:~# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
smqycb25imit8o0hia9lzebpj * manager Ready Active Leader 20.10.21
u9k58es6qj07b3f8kkkmaejk1 worker1 Ready Active 20.10.21
b282nqvoqjeqgmwr4gkm0habd worker2 Ready Active 20.10.21
<만약 클러스터(worker)에서 문제 발생시>
*************************************************************************************************
docker swarm leave 명령어를 쳐주면 된다.
*************************************************************************************************
root@manager:~# docker network ls
NETWORK ID NAME DRIVER SCOPE
4438cb97b781 bridge bridge local
f793a6095a77 docker_gwbridge bridge local
e9cd4f802b87 host host local
vcpomu66cbhg ingress overlay swarm # <overlay> 라는 드라이버가 생겨있음 지금 오버레이된 상태라고 볼 수 있음
1071e4483249 none null local
<자세히 들여다 보는 명령어>
root@manager:~# docker node inspect worker1
<노드를 swarm 에서 제외시키고 싶다>
root@manager:~# docker node rm
<매니저 승격시키기>
root@manager:~# docker node promote
root@manager:~# docker service create --replicas 2 -p 5555:80 --name web nginx
overall progress: 2 out of 2 tasks
1/2: running
2/2: running
verify: Service converged
root@manager:~# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
ptx20t3914qi web replicated 2/2 nginx:latest *:5555->80/tcp
# 서비스 목록 2개 만들어진 것을 확인할 수 있음 (REPLICAS)
<도커 서비스(web)의 상태를 보고싶다면>
root@manager:~# docker service ps web
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
vnl1hdzfez0m web.1 nginx:latest worker1 Running Running about a minute ago
8zhz84i0mnjo web.2 nginx:latest manager Running Running about a minute ago
# DESIRED STATE : 원하는 상태
# CURRENT STATE : 현재 상태
<도커 서비스(web) 삭제>
root@manager:~# docker service rm web
web
root@manager:~# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS