티스토리 뷰

Docker 와 Container

Docker - compose

looeon 2024. 3. 6. 13:59

 

▶ 명령어 입력

[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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함