티스토리 뷰
▶ 명령어 입력
[vagrant@docker1 work]$ docker run -d --name=mydb -p 9001:3306 --env MYSQL_ROOT_PASSWORD=mypass --env MYSQL_USER=myuser --env MYSQL_PASSWORD=userpass --env MYSQL_DATABASE=mydb -v /var/dbdata:/var/lib/mysql mysql:latest
Unable to find image 'mysql:latest' locally
latest: Pulling from library/mysql
81badc5f380f: Pull complete
c490e5dd1a9d: Pull complete
87aeb61f1478: Pull complete
1cacbea6ceda: Pull complete
1e72891ace67: Pull complete
42b720363d36: Pull complete
6b3b50f9990a: Pull complete
3811d52cfa61: Pull complete
05bc7a0277d8: Pull complete
cc0abd25a274: Pull complete
Digest: sha256:ff5ab9cdce0b4c59704b4e2a09deed5ab8467be795e0ea20228b8528f53fcf82
Status: Downloaded newer image for mysql:latest
875918edf4850a45f53dd4213c6c67dd4cfc2e4fbb3a8fb0053a881f691e7443
# -- env 변수로 root 암호 설정 / --env myuser 생성 / --env myuser 비밀번호 생성 / --env mydb db 생성
create user myuser
grant all privileges on mydb.*
to myuser indentified by 'userpass'
[vagrant@docker1 work]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
875918edf485 mysql:latest "docker-entrypoint.s…" About a minute ago Up About a minute 33060/tcp, 0.0.0.0:9001->3306/tcp, :::9001->3306/tcp mydb
▷ myapache 올린다
[vagrant@docker1 work]$ docker run -d --name myapache -p 9000:80 --link mydb:mysql8 httpd:2.4
[vagrant@docker1 work]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4be694ea7d6d httpd:2.4 "httpd-foreground" 14 seconds ago Up 13 seconds 0.0.0.0:9000->80/tcp, :::9000->80/tcp myapache
875918edf485 mysql:latest "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 33060/tcp, 0.0.0.0:9001->3306/tcp, :::9001->3306/tcp mydb
# link 뒤에는 원래 mydb : 뒤에는 mysql8 이라는 별명 설정
# hosts 에 넣어준다
# myapache 와 mysql 을 같이 쓰기 위해서 연결해줘야 하는데, ip 를 설정하고
# 올리기가 번거롭기때문에 이름으로 접근한다
# hsots 에 한번에 올린다
[vagrant@docker1 work]$ docker exec -it myapache /bin/bash
root@4be694ea7d6d:/usr/local/apache2# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 mysql8 875918edf485 mydb
172.17.0.2 4be694ea7d6d
Docker-compose
여러개의 컨테이너를 하나처럼 사용한다
# apache 가 죽으면 mysql 도 죽이고, 시작하면 같이 시작하고 >> 같이 묶어서 관리
# 위 과정으로 명령어로 실행해도 되지만, 파일로 만들어서 간단하게 실행할 수 있다
▷ yaml 파일 만들기 편리함을 위한 사전작업
○ ~/.vimrc 파일
autocmd FileType yaml setlocal ts=2 shiftwidth=2 sts=2 expandtab ai
○ ~/.nanorc 파일
# nano editor config for yaml syntax highliting
syntax "default"
color white,black ".*"
## Keys
color magenta "^\s*[\$A-Za-z0-9_-]+\:"
color brightmagenta "^\s*@[\$A-Za-z0-9_-]+\:"
# Values
color white ":\s.+$"
# Booleans
icolor brightcyan " (y|yes|n|no|true|false|on|off)$"
## Numbers
color brightred " [[:digit:]]+(\.[[:digit:]]+)?"
## Arrays
color red "\[" "\]" ":\s+[|>]" "^\s*- "
## Reserved
color green "(^| )!!(binary|bool|float|int|map|null|omap|seq|set|str) "
## Comments
color brightwhite "#.*$"
## Errors
color ,red ":\w.+$"
color ,red ":'.+$"
color ,red ":".+$"
color ,red "\s+$"
## Non closed quote
color ,red "['\"][^['\"]]*$"
## Closed quotes
color yellow "['\"].*['\"]"
## Equal sign
color brightgreen ":( |$)"
# tab size
set tabsize 2
set tabstospaces
▶ sample1.yaml 파일
# version 은 3.9 로 적어두어 다른 사용자가 알 수 있도록 한다
# key 와 value 를 띄우는 것이기 때문에 httpd:2.4 는 붙여서 쓴다
# environment 를 사용하여 변수 설정
# 포트포워딩을 진행
version: '3.9'
services:
myapache:
image: httpd:2.4
ports:
- "9000:80"
mydb:
image: mysql:latest
ports:
- "9001:3306"
environment:
- MYSQL_ROOT_PASSWORD=mypass
- MYSQL_USER=myuser
- MYSQL_PASSWORD=userpass
- MYSQL_DATABASE=mydb
volumes:
- /var/dbdata:/var/lib/mysql
# 명령어로 실습하였기에 내용을 삭제해준다
[vagrant@docker1 work]$ sudo rm -rf /var/dbdata
[vagrant@docker1 work]$ sudo ll /var/dbdata
▷ sample1.yaml 실행
# 기본값은 docker-compose.yaml / yml 로 되어있는데
# 우리는 이름을 다르게 하여 up 으로 안된다
[vagrant@docker1 work]$ docker compose up
no configuration file provided: not found
# yaml 에서 Shift + v 로 블록지정하여 shift + > or < 로 이동 가능하다
▷ docker compose 로 실행
#container_name 을 지정하면 work_* 으로 적용이 안된다
[vagrant@docker1 work]$ docker compose -f sample1.yaml up
# -d 를 가장 뒤에 붙여야 오류가 안난다
# 백그라운드에서 진행
[vagrant@docker1 work]$ docker compose -f sample1.yaml up -d
[+] Running 2/2
✔ Container work-myapache-1 Started 0.0s
✔ Container work-mydb-1 Started
# 컨테이너 안에 있는 데이터
[vagrant@docker1 work]$ ls /var/dbdata
auto.cnf client-cert.pem ibdata1 mysql.ibd server-cert.pem
binlog.000001 client-key.pem ibtmp1 mysql.sock server-key.pem
binlog.index #ib_16384_0.dblwr #innodb_redo performance_schema sys
ca-key.pem #ib_16384_1.dblwr #innodb_temp private_key.pem undo_001
ca.pem ib_buffer_pool mysql public_key.pem undo_002
# 컨테이너에 붙어있는 NAME 이 다르다
# 프로젝트 명이 work 인데, work 디렉터리에 존재하므로, 붙는다
# 가장 뒤의 숫자는 자동으로 붙게된다
[vagrant@docker1 work]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4bc32d12a2d7 httpd:2.4 "httpd-foreground" 38 seconds ago Up 37 seconds 0.0.0.0:9000->80/tcp, :::9000->80/tcp work-myapache-1
92f62a7d5548 mysql "docker-entrypoint.s…" 38 seconds ago Up 37 seconds 33060/tcp, 0.0.0.0:9001->3306/tcp, :::9001->3306/tcp work-mydb-1
▷ DB 연결
[vagrant@docker1 work]$ docker exec -it work-myapache-1 /bin/bash
root@4bc32d12a2d7:/usr/local/apache2# cat /etc/issue
Debian GNU/Linux 12 \n \l
▷ apt 패키지 설치
>> mydb 로 핑을 날렸는데 잘날아간다
>> 근데 / etc / hosts 에는 내용이 없다
root@4bc32d12a2d7:/usr/local/apache2# apt update
root@4bc32d12a2d7:/usr/local/apache2# apt install iputils-ping
root@4bc32d12a2d7:/usr/local/apache2# apt install dnsutils
root@4bc32d12a2d7:/usr/local/apache2# ping mydb
PING mydb (172.18.0.2) 56(84) bytes of data.
64 bytes from work-mydb-1.work_default (172.18.0.2): icmp_seq=1 ttl=64 time=0.055 ms
64 bytes from work-mydb-1.work_default (172.18.0.2): icmp_seq=2 ttl=64 time=0.106 ms
64 bytes from work-mydb-1.work_default (172.18.0.2): icmp_seq=3 ttl=64 time=0.086 ms
--- mydb ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2018ms
rtt min/avg/max/mdev = 0.055/0.082/0.106/0.021 ms
root@4bc32d12a2d7:/usr/local/apache2# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.18.0.3 4bc32d12a2d7
# Host 가 DNS 에 등록되어 있다
root@4bc32d12a2d7:/usr/local/apache2# cat /etc/resolv.conf
search example.com
nameserver 127.0.0.11
options ndots:0
# nslookup 으로 보면 DNS로 확인된다
root@4bc32d12a2d7:/usr/local/apache2# nslookup mydb
Server: 127.0.0.11
Address: 127.0.0.11#53
Non-authoritative answer:
Name: mydb
Address: 172.18.0.2
▶ compose 되어 있는 파일명만 알아도 compose 된 컨테이너들을 모두 중단할 수 있다
[vagrant@docker1 work]$ docker compose -f sample1.yaml stop
[+] Stopping 2/2
✔ Container work-myapache-1 Stopped 1.2s
✔ Container work-mydb-1 Stopped 1.2s
○ docker compose 이후에 명령어도 다양하다
[vagrant@docker1 work]$ docker compose
attach cp events kill pause pull rm start top version
build create exec logs port push run stats unpause wait
config down images ls ps restart scale stop up watch
○ 파일로도 확인이 된다
[vagrant@docker1 work]$ docker compose -f sample1.yaml ps -a
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
work-myapache-1 httpd:2.4 "httpd-foreground" myapache 14 minutes ago Exited (0) About a minute ago
work-mydb-1 mysql "docker-entrypoint.s…" mydb 14 minutes ago Exited (0) About a minute ago
○ 컨테이너 이름을 쓸 필요 없이 파일만 알아도 모두 한번에 관리 할 수 있다
[vagrant@docker1 work]$ docker compose -f sample1.yaml
attach cp events kill pause pull rm start top version
build create exec logs port push run stats unpause wait
config down images ls ps restart scale stop up watch
[vagrant@docker1 work]$ docker compose -f sample1.yaml rm
? Going to remove work-myapache-1, work-mydb-1 Yes
[+] Removing 2/0
✔ Container work-mydb-1 Removed 0.0s
✔ Container work-myapache-1 Removed 0.0s
>> 자동으로 만들어진 work network
# 172.18.0.0 대역으로 만들어진다
>>> 컨테이너로 지워도 남아있다
[vagrant@docker1 work]$ docker network ls
NETWORK ID NAME DRIVER SCOPE
be27f1d8c1c6 bridge bridge local
28479fceff7b host host local
8498db25e184 none null local
3fbbdcc89205 work_default bridge local
[vagrant@docker1 work]$ ip a s | grep 172.18
inet 172.18.0.1/16 brd 172.18.255.255 scope global br-3fbbdcc89205
>> 도커 네트워크 삭제
[vagrant@docker1 work]$ docker network prune
WARNING! This will remove all custom networks not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Networks:
work_default
[vagrant@docker1 work]$ docker network ls
NETWORK ID NAME DRIVER SCOPE
be27f1d8c1c6 bridge bridge local
28479fceff7b host host local
8498db25e184 none null local
◆ sample2.yaml 파일 >> docker-compose.yaml [ 기본값 인식 가능 ] 변경
>> 사용자 정의 bridge 추가
# ipam : ip address management or ip administrator같은 느낌으로 파악하자
# webapps > ipam 까지만 쓰면 자동 생성
# ipam >> config >> subnet 으로 직접 생성
>> 컨테이너 지우고 다시 올려도 항상 고정되게 IP 사용이 가능하다
# mysql:5.7 버전이 올라가는데 시간이 걸리므로 포어그라운드로 확인하기 좋다
# depends_on 이 있을 때와 없을 때의 차이를 확인해보자
# ipam 은 webapps 의 종속관계
version: '3.9'
networks:
webapps:
driver: bridge
ipam:
config:
- subnet: 172.30.0.0/16
services:
myapache:
image: httpd:2.4
ports:
- "9000:80"
networks:
webapps:
ipv4_address: 172.30.0.10
# depends_on:
# - mydb
mydb:
image: mysql
ports:
- "9001:3306"
networks:
webapps:
ipv4_address: 172.30.0.11
environment:
- MYSQL_ROOT_PASSWORD=mypass
- MYSQL_USER=myuser
- MYSQL_PSSWORD=userpass
- MYSQL_DATABASE=mydb
volumes:
- /var/dbdata:/var/lib/mysql:5.7
▷ network 를 만들고 apache 가 먼저이므로 실행 >> db 가 실행된다
docker compose up
>> Ctrl + c >> docker compose rm -f ( 비 대화식 삭제 )
▶ depends_on 주석을 풀고 설정한다
version: '3.9'
networks:
webapps:
driver: bridge
ipam:
config:
- subnet: 172.30.0.0/16
services:
myapache:
image: httpd:2.4
ports:
- "9000:80"
networks:
webapps:
ipv4_address: 172.30.0.10
depends_on:
- mydb
mydb:
image: mysql
ports:
- "9001:3306"
networks:
webapps:
ipv4_address: 172.30.0.11
environment:
- MYSQL_ROOT_PASSWORD=mypass
- MYSQL_USER=myuser
- MYSQL_PSSWORD=userpass
- MYSQL_DATABASE=mydb
volumes:
- /var/dbdata:/var/lib/mysql:5.7
>> apache 가 올라가기 전에 db 가 먼저 올라간다
# db 가 끝나기 전에 apache 가 끝이난다
# db 가 더 시간이 걸리는 와중에 apache 가 끝났다
>>> depends_on 은 db 가 다 끝나고 apache 가 올라가는게 아니다
▩ - t 옵션을 안넣으면 프롬프트가 안뜬다
[vagrant@docker1 ~]$ docker run --rm -i mysql:5.7 /bin/bash
pwd
/
whoami
root
● db 가 완료되고 apache 실행시키기 위해서는
>> health check 가 필요하다
▩ 바로 실행해서 컨테이너 접근하려니까 안된다
>> 컨테이너를 실행 시키고 접속 따로 해야 한다
[vagrant@docker1 ~]$ docker run --rm -it mysql:5.7 /bin/bash
bash-4.2# mysqladmin ping
mysqladmin: connect to server at 'localhost' failed
error: 'Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)'
Check that mysqld is running and that the socket: '/var/run/mysqld/mysqld.sock' exists!
bash-4.2# mysqladmin ping
● 따로 따로 접근
[vagrant@docker1 ~]$ docker run -d -e MYSQL_ROOT_PASSWORD=mypass mysql:5.7
bfa511e22584c76285254e7946d0ead677b32bb37fc816394554f8bb675e3ebe
[vagrant@docker1 ~]$ docker exec -it dreamy_nash /bin/bash
● healthcheck 가 mysql 에서 제대로 작동하는 것을 확인할 수 있다
bash-4.2# mysqladmin ping -u root -pmypass -h localhost
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
mysqld is alive
▶ 설정파일
>> interval 5초간격으로 시도
>> timeout 5초까지 기다려준다
>> retries 3번 시도되면 살아있다
>> 10초 하고 10초 기다린다
# condition 이라는 조건이 필요하다 >> healthy 일때에 depends_on 이후 진행된다
# service_healthy 는 healthcheck 로 정해져있다
version: '3.9'
networks:
webapps:
driver: bridge
ipam:
config:
- subnet: 172.30.0.0/16
services:
myapache:
image: httpd:2.4
ports:
- "9000:80"
networks:
webapps:
ipv4_address: 172.30.0.10
depends_on:
mydb:
condition: "service_healthy"
mydb:
image: mysql
ports:
- "9001:3306"
networks:
webapps:
ipv4_address: 172.30.0.11
environment:
- MYSQL_ROOT_PASSWORD=mypass
- MYSQL_USER=myuser
- MYSQL_PSSWORD=userpass
- MYSQL_DATABASE=mydb
volumes:
- /var/dbdata:/var/lib/mysql:5.7
healthcheck:
test: ["CMD","mysqladmin","ping","-u","root","-pmypass","-h","localhost"]
interval: 5s
timeout: 5s
retries: 3
start_period: 10s
○ curl / chrome 모두 확인
[vagrant@docker1 work]$ curl http://172.30.0.10
<html><body><h1>It works!</h1></body></html>
○ 포트포워딩이 되어있으므로, 대문자 P ( 포트번호 옵션 ) 으로도 원격 접속이 가능하다
mysql -u root -pmypass -h 192.168.25.10 -P9001
>> Ubuntu 장비에서 접속되었다
'Docker 와 Container' 카테고리의 다른 글
오케스트레이션 [orchestration] (0) | 2024.03.06 |
---|---|
Docker compose 응용 (0) | 2024.03.06 |
Docker registry 배포 (0) | 2024.03.06 |
Docker image upload (0) | 2024.03.06 |
LAB1 (0) | 2024.03.05 |