티스토리 뷰
● Docker - 단일 노드
● Docker Swarm - 오케스트레이션 => 멀티노드
● Kubernetes - 오케스트레이션의 표준
[ 어 려 움 ]
● Openshift ( 상용 ) - RedHat
- 쿠버네틱스에서 못하는 기능이 있다
- 쿠버네틱스의 복잡함에서 쉽게 사용 가능하다
- 상용 제품이므로 기술 지원 받을 수 있다
# 자격증 존재
● vm 하드웨어 가상화 / container 운영체제 가상화
# 오케스트레이션 : 여러 개의 컴퓨터 시스템, 애플리케이션 및/또는 서비스를 조율하고 관리하는 것으로, 여러 개의 작업을 함께 연결하여 크기가 큰 워크플로나 프로세스를 실행하는 방식
실습 환경 조성
OS | CentOS / Ubuntu |
Ram | 4G |
Nic | NAT / NIC ( Hostonly ) |
IP | 192.168.25.10 / 192.168.25.20 |
CPU | Core 2개 |
Disk | 30G ( Thin ) |
vg.gui | true or false |
▶전에 사용했던 Vagrantfile 을 사용하자
▶ Vagrantfile / ssh_conf.sh >> CentOS 에서는 2개만 있으면 된다
▷ 192.168.25.0 대역으로 Nic 추가
▷ Vagrantfile
# --- Docker Based centOS7 ---
Vagrant.configure("2") do |config|
config.vm.define "docker-vm" do |cfg|
cfg.vm.box = "centos/7"
cfg.vm.provider "virtualbox" do |vb|
vb.name = "docker-vm"
vb.cpus = 2
vb.memory = 4096
vb.gui = false
end
cfg.vm.host_name = "docker1.example.com"
cfg.vm.network "private_network", ip: "192.168.25.10"
cfg.vm.provision "shell", path:"ssh_conf.sh"
cfg.vm.synced_folder "../data","/vagrant",disabled: true
end
# --- Docker Based Ubuntu22.04 ---
config.vm.define "docker-vm2" do |cfg|
cfg.vm.box = "generic/ubuntu2204"
cfg.vm.provider "virtualbox" do |vb|
vb.name = "docker-vm2"
vb.cpus = 2
vb.memory = 4096
vb.gui = false
end
cfg.vm.host_name = "docker2.example.com"
cfg.vm.network "private_network", ip: "192.168.25.20"
#cfg.vm.provision "shell", path:"ssh_conf.sh"
cfg.vm.synced_folder "../data","/vagrant",disabled: true
end
end
▶ Docker 설치 파일
https://docs.docker.com/engine/install/
https://docs.docker.com/engine/install/centos/
https://docs.docker.com/engine/install/ubuntu/
▷ Docker 에서 필수로 설치해야 하는 3가지
docker-ce / docker-ce-cli / containerd.io
( ce / client / )
▶ Docker 자주 사용하는 명령어
docker --help ; 도커의 모든 옵션과 sub command 출력
docker sub command --help
ex) docker logs --help
Usage: docker top CONTAINER [ps OPTIONS]
Display the running processes of a container
docker pull httpd:2.4 ; docker image download
docker image ls ; download 된 docker image 출력
docker images ; docker image ls 와 동일하다
docker run httpd:2.4 ; 컨테이너를 foreground 로 실행
docker run -d httpd:2.4 ; 컨테이너를 background 로 실행
docker run -d --name myapache httpd:2.4 ; 컨테이너 이미지 이름 설정
docker exec 컨테이너이름 명령어
ex) docker exec ubuntu(컨테이너이름) /bin/hostname
* 실행중인 컨테이너 내부로 들어가서 작업하려면
docker exec -it 컨테이너이름 /bin/bash : -it 옵션을 반드시 줘야 한다.
- container 삭제
docker container stop 컨테이너이름 또는 container ID ; 중단
docker container rm 컨테이너이름 또는 container ID ; 삭제
- 두개이상의 컨테이너를 한번에 삭제하려면
docker container stop $(docker ps -q)
docker container rm $(docker ps -aq)
- docker image 삭제
$docker rmi $(docker images -q)
$docker rmi -f $(docker images -q)
-f(force) : 강제로.
▶/etc/yum.repos.d/docker-ce.repo 다운로드
▷ 정상 작동 확인
>> hello-world 라는 container
# 전제 : sudo systemctl restart docker
▶ Ubuntu Docker 설치
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
# - o 옵션은 이름을 바꿔서 저장
sudo chmod a+r /etc/apt/keyrings/docker.asc
공개 GPG Key 생성
▷ 이후에 설치 시작한다
>> Ubuntu 는 설치하면 바로 Docker 가 실행된다
▶ containerd 는 docker 에 종속 관계이므로, enabled 로 바꿀 필요가 없다
▷ 종속 관계 확인
sudo systemctl list-dependencies docker
▶ VM vs Containers
○ VM 은 각 VM 마다 개별의 OS 가 필요하지만, Containers 에는 Host OS 를 OS로 사용한다
# VM 은 각각 하나의 물리적인 장비로 생각하자
○ 바이너리(Bins)와 라이브러리(libs)는 각각 개별의 것을 쓰지만, Kernel은 Host OS의 것을 사용한다
○ 따라서 VM 은 무겁지만 Containers 는 가볍고 빠르고 간단하게 사용할 수 있다
# docker 는 압축되어 있는 image 를 병렬로 다운로드하여 속도가 빠르다
○ conatiners 는 운영체제를 가리지 않는다
# CentOS 에서 쓰던 것을 Ubuntu 에서 사용 할 수 있다
container
어플리케이션이 실행되는데 필요한 코드와 종속성을 함께 패키징한다
여러 컨테이너가 동일한 시스템에서 실행될수 있으며,
각 컨테이너는 격리된 프로세스로 실행이 된다.
컨테이너는 vm 보다 필요한 리소스가 작다
vm
하나의 서버를 여러서버로 바꾸는 물리적 하드웨어의 추상화
하이퍼바이저를 사용해서 단일시스템에서 여러 개의 vm을 실행 할 수 있다
각각의 vm 에는 운영체제, 어플리케이션, 바이너리파일 및 라이브러리가 포함되어 있으며
일반적으로 container 에 비해서 크기가 크고 리소스를 많이 차지한다.
▶ Docker 명령어는 일반계정 권한으로 사용할 수 없다
▷ docker.sock
[vagrant@docker1 ~]$ ll /var/run/docker.sock
srw-rw----. 1 root docker 0 Mar 4 10:55 /var/run/docker.sock
▷ 일반 계정 권한으로 docker 사용하려면 docker 그룹에 넣는다
>> 꼭 재시작 해야한다 ( groups 에는 속해있다 )
sudo usermod -aG docker vagrant
▷ 실행 중인 컨테이너 확인
sudo docker container ps
▷ 모든 컨테이너 확인
sudo docker container ps -a
▶ 명령어 실행 >> 도커데몬에 전달 >> registry 에서 이미지를 가져와서 >> container로 띄운다
# alpine linux 는 크기가 굉장히 작으므로, container 에서 많이 사용한다
▷ docker pull 로 이미지를 가져온다
[vagrant@docker1 ~]$ docker pull alpine
Using default tag: latest
latest: Pulling from library/alpine
4abcf2066143: Pull complete
Digest: sha256:c5b1261d6d3e43071626931fc004f70149baeba2c8ec672bd4f27761f8e1ad6b
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest
▷ 실행하지 않으면 파일 / 실행하면 container
[vagrant@docker1 ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine latest 05455a08881e 5 weeks ago 7.38MB
hello-world latest d2c94e258dcb 10 months ago 13.3kB
▷ docker image 는 레이어 형태로 나뉘어져 있다
[vagrant@docker1 ~]$ docker pull mariadb:latest
latest: Pulling from library/mariadb
01007420e9b0: Pull complete
31505b2b3fb6: Pull complete
97328dbb4b34: Pull complete
15d22565a968: Pull complete
a150d2776ac9: Pull complete
5b0eb1c11437: Pull complete
11ffc9dfe027: Pull complete
51f9c9c328e6: Pull complete
Digest: sha256:851f05fe1e4cb290442c1b12b7108436a33fd8f6a733d4989950322d06d45c65
Status: Downloaded newer image for mariadb:latest
docker.io/library/mariadb:latest
▷ docker info 로 docker 의 정보를 확인할 수 있다
[vagrant@docker1 ~]$ docker info
Client: Docker Engine - Community
Version: 25.0.3
Context: default
Debug Mode: false
Plugins:
buildx: Docker Buildx (Docker Inc.)
Version: v0.12.1
Path: /usr/libexec/docker/cli-plugins/docker-buildx
compose: Docker Compose (Docker Inc.)
Version: v2.24.6
Path: /usr/libexec/docker/cli-plugins/docker-compose
>> Yum 으로 받았다면 최신 버전이 안된다
>> docker 는 최신화가 빠르다
Server:
Containers: 2
Running: 0
Paused: 0
Stopped: 2
Images: 3
Server Version: 25.0.3
Storage Driver: overlay2
>> overlay 형태로 되어있으므로 병렬로 다운로드한다
>> 투명 셀로판지를 생각해보자 위에서보면 다 보인다
Backing Filesystem: xfs
Supports d_type: true
Using metacopy: false
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Cgroup Version: 1
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
Swarm: inactive
Runtimes: io.containerd.runc.v2 runc
Default Runtime: runc
Init Binary: docker-init
containerd version: ae07eda36dd25f8a1b98dfbf587313b99c0190bb
runc version: v1.1.12-0-g51d5e94
init version: de40ad0
Security Options:
seccomp
Profile: builtin
Kernel Version: 3.10.0-1127.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 3.701GiB
Name: docker1.example.com
ID: 6e72a155-211d-4c23-a87d-6eda69b92af0
Docker Root Dir: /var/lib/docker
Debug Mode: false
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
▶ docker image를 ls mariadb 로 찾아보면 짧게 나오지만,
>> - - no - trunc 옵션으로 모두 보게 되면, 굉장히 긴 image ID가 나온다
[vagrant@docker1 ~]$ docker image ls mariadb --no-trunc
REPOSITORY TAG IMAGE ID CREATED SIZE
mariadb latest sha256:b8bba28b797b16949bb91f9d0834f53d0a85633e7a902453029570b19dc45bf8 11 days ago 405MB
[vagrant@docker1 ~]$ docker image ls mariadb
REPOSITORY TAG IMAGE ID CREATED SIZE
mariadb latest b8bba28b797b 11 days ago 405MB
▷find 를 사용하여 찾아보면 / var / lib / docker / image / overlay2 디렉터리에서 확인 가능하다
[vagrant@docker1 ~]$ sudo find /var/lib/docker -name 'sha256'
/var/lib/docker/image/overlay2/layerdb/sha256
/var/lib/docker/image/overlay2/imagedb/content/sha256
/var/lib/docker/image/overlay2/imagedb/metadata/sha256
/var/lib/docker/image/overlay2/distribution/v2metadata-by-diffid/sha256
/var/lib/docker/image/overlay2/distribution/diffid-by-digest/sha256
▶ 도커 이미지에 대한 메타데이터를 확인
## docker container insepect [ name ] >> 컨테이너에 대한 메타데이터
docker inspect httpd
▶ container life cycle
[ create >> start >> rm ]
▷ container 가 만들어졌으나, 실행은 아직 안되어있다
[vagrant@docker1 ~]$ docker container create --name apache httpd
b63c1eb64ed8de43a86e33246b907ea32c4cf4d99ebc8f2fd2daf3c3acae4463
[vagrant@docker1 ~]$ docker container ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b63c1eb64ed8 httpd "httpd-foreground" 11 seconds ago Created apache
08d69dc39fcf hello-world "/hello" 2 hours ago Exited (0) 2 hours ago epic_saha
ab4fd4b3fe4a hello-world "/hello" 2 hours ago Exited (0) 2 hours ago mystifying_jemison
▷ 실행되었다
[vagrant@docker1 ~]$ docker start apache
apache
[vagrant@docker1 ~]$ docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b63c1eb64ed8 httpd "httpd-foreground" 2 minutes ago Up 37 seconds 80/tcp apache
▷ 중단 시키고 삭제해야 한다
[vagrant@docker1 ~]$ docker container stop apache
apache
[vagrant@docker1 ~]$ docker container rm apache
apache
▶ create + start == run
>> foreground 로 실행된다
▷ 다른 창으로 확인해야한다
>> 문제없이 실행되고 있다
[vagrant@docker1 ~]$ docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ff167ef6376d httpd:2.4 "httpd-foreground" 2 minutes ago Up 2 minutes 80/tcp awesome_shtern
▷ container 의 names 는 유명한 사람이나 랜덤으로 등록이 된다
[vagrant@docker1 ~]$ docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ff167ef6376d httpd:2.4 "httpd-foreground" 2 minutes ago Up 2 minutes 80/tcp awesome_shtern
[vagrant@docker1 ~]$ docker container inspect awesome_shtern
>> 메티데이터로 172.17.0.2 IP 를 확인했다
▷ curl 로는 확인되지만 , 원격에서는 접속이 안된다
# 포트포워딩이 필요하다
[vagrant@docker1 ~]$ curl http://172.17.0.2
<html><body><h1>It works!</h1></body></html>
▶ 일단 멈추고 지우고 다시 실행해야한다
[vagrant@docker1 ~]$ docker stop awesome_shtern
awesome_shtern
[vagrant@docker1 ~]$ docker rm awesome_shtern
awesome_shtern
▶ 실행하면서 포트포워딩이 가능하다
[vagrant@docker1 ~]$ docker run -p 9000:80 httpd:2.4
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
[Mon Mar 04 04:00:09.487138 2024] [mpm_event:notice] [pid 1:tid 140466586171264] AH00489: Apache/2.4.58 (Unix) configured -- resuming normal operations
[Mon Mar 04 04:00:09.487360 2024] [core:notice] [pid 1:tid 140466586171264] AH00094: Command line: 'httpd -D FOREGROUND'
192.168.25.1 - - [04/Mar/2024:04:00:54 +0000] "GET / HTTP/1.1" 200 45
192.168.25.1 - - [04/Mar/2024:04:00:54 +0000] "GET /favicon.ico HTTP/1.1" 404 196
192.168.25.1 - - [04/Mar/2024:04:01:46 +0000] "-" 408 -
▷ 원격 접속 확인
# 9000 번 포트를 적어줘야 한다
▶ 백그라운드로 container 를 실행한다
# - d 옵션
[vagrant@docker1 ~]$ docker run -d --name apache httpd:2.4
2fae5b29edd9d749cd8e58f3c1e13d534e89c63eac8a1d7183041231a083a47b
▶ 컨테이너에서 명령어 실행법
>> docker container exec [ name ] [ 명령어 ]
>> [ execulate ]
[vagrant@docker1 ~]$ docker container exec apache hostname
2fae5b29edd9
▶ 셀은 대화식으로 실행한다
>> 따라서 컨테이너 내부로 들어갔다가 바로 나온다
[vagrant@docker1 ~]$ docker container exec apache /bin/bash
[vagrant@docker1 ~]$
>> - i ( interrupt )
[vagrant@docker1 ~]$ docker container exec -i apache /bin/bash
hostname
2fae5b29edd9
pwd
/usr/local/apache2
exit
▶불편하기에, 셀로 접속할 때에는 - i t 를 같이 붙인다
>> - t ( tty 를 의미한다 )
[vagrant@docker1 ~]$ docker container exec -it apache /bin/bash
▷ 하지만, 명령어가 없는 것이 많다
# 인터넷은 된다
root@2fae5b29edd9:/usr/local/apache2# ip a s
bash: ip: command not found
root@2fae5b29edd9:/usr/local/apache2# ip addres show
bash: ip: command not found
root@2fae5b29edd9:/usr/local/apache2# ps
bash: ps: command not found
root@2fae5b29edd9:/usr/local/apache2# vi
bash: vi: command not found
root@2fae5b29edd9:/usr/local/apache2# nano
bash: nano: command not found
▷ container httpd 의 초기페이지를 컨테이너 내부에 들어가서 바꾸기
>> / var / www / html 이 없다 find 로 찾아야한다
root@2fae5b29edd9:/usr/local/apache2# ls /var/www/html
ls: cannot access '/var/www/html': No such file or directory
root@2fae5b29edd9:/usr/local/apache2# find / -name index.html
find: '/proc/1/map_files': Operation not permitted
find: '/proc/8/map_files': Operation not permitted
find: '/proc/9/map_files': Operation not permitted
find: '/proc/10/map_files': Operation not permitted
find: '/proc/123/map_files': Operation not permitted
find: '/proc/135/map_files': Operation not permitted
/usr/local/apache2/htdocs/index.html
root@2fae5b29edd9:/usr/local/apache2# cd /usr/local/apache2/
root@2fae5b29edd9:/usr/local/apache2# cd htdocs/
root@2fae5b29edd9:/usr/local/apache2/htdocs# ls
index.html
root@2fae5b29edd9:/usr/local/apache2/htdocs# echo "hello docker" > index.html
root@2fae5b29edd9:/usr/local/apache2/htdocs# cat index.html
hello docker
[vagrant@docker1 ~]$ curl http://172.17.0.2
hello docker
▶ 운영체제 컨테이너는 shell 을 실행하도록 도커이미지가 만들어진다
>> docker run 을 넣어도 - i t 를 빼면, 실행이 되지 않는다
[vagrant@docker1 ~]$ docker run -d --name alpine-2 alpine
9cf1c4c83965a7dd6a3b8a9a26b659197cf2883cd2ee8eb454c1d43da20b5d92
[vagrant@docker1 ~]$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9cf1c4c83965 alpine "/bin/sh" 25 seconds ago Exited (0) 24 seconds ago alpine-2
>> - i t 를 넣어야 운영체제 컨테이너는 실행이 된다
[vagrant@docker1 ~]$ docker run -d -it --name alpine-1 alpine
a4a54da3ca992fa2cea0f1431083d342ebfe92a5bd3fe385cae01b7285621a85
[vagrant@docker1 ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a4a54da3ca99 alpine "/bin/sh" 5 seconds ago Up 3 seconds alpine-1
▩ 실행 최대 개수가 존재
[vagrant@docker1 ~]$ docker run -d --name centos8 centos:8
Unable to find image 'centos:8' locally
docker: Error response from daemon: toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit.
■ docker 아이디로 접속하면 200개 까지 다운로드가 가능하다
docker login
>> 로그인 하면 ~/.docker 가 생성된다
[vagrant@docker1 ~]$ ll -a
total 20
drwx------. 4 vagrant vagrant 126 Mar 4 15:17 .
drwxr-xr-x. 3 root root 21 May 1 2020 ..
-rw-------. 1 vagrant vagrant 3752 Mar 4 14:45 .bash_history
-rw-r--r--. 1 vagrant vagrant 18 Apr 1 2020 .bash_logout
-rw-r--r--. 1 vagrant vagrant 193 Apr 1 2020 .bash_profile
-rw-r--r--. 1 vagrant vagrant 313 Mar 4 14:45 .bashrc
drwx------. 2 vagrant vagrant 25 Mar 4 15:14 .docker
drwx------. 2 vagrant vagrant 29 Mar 4 10:24 .ssh
-rw-------. 1 vagrant vagrant 1446 Mar 4 15:17 .viminfo
>> 계정에 관련된 내용이 들어있다
[vagrant@docker1 .docker]$ ll
total 4
-rw-------. 1 vagrant vagrant 103 Mar 4 15:19 config.json
>> config.json 을 없애려면, 장비를 꺼도 남아있기 때문에
docker logout
▶ 컨테이너의 아이디를 한번에 보는법
>> - q 실행중인 컨테이너
>> - a q 모든 컨테이너
>>> docker stop `docker container ps -aq` : ` 로도 가능하다
[vagrant@docker1 ~]$ docker container ps -q
90e0fc8a7743
31622b5431b8
810214c61411
a4a54da3ca99
41c08079960b
[vagrant@docker1 ~]$ docker container ps -aq
90e0fc8a7743
31622b5431b8
810214c61411
9cf1c4c83965
a4a54da3ca99
41c08079960b
2fae5b29edd9
6f63c8715bd4
08d69dc39fcf
ab4fd4b3fe4a
▷ 한번에 컨테이너 멈추기
>> $ ( docker container ps -q )
>> $ ( 내용 ) == 내용의 실행 값
[vagrant@docker1 ~]$ docker stop $(docker container ps -q)
90e0fc8a7743
31622b5431b8
810214c61411
a4a54da3ca99
41c08079960b
◎ docker rm 명령어를 alias에 등록하자 ( stop 후 rm 을 한번에 지정 )
## vim .bashrc 에 등록후 source .bashrc
alias all_container_rm='docker stop $(docker ps -q) ; docker rm $(docker ps -aq)
# docker conatiner 명령어에서 container 는 생략이 가능하다
◎ foreground 실행시 Ctrl + c 로 종료 할 수 있다
[vagrant@docker1 ~]$ docker run httpd
^C
[Mon Mar 04 05:54:04.843911 2024] [mpm_event:notice] [pid 1:tid 140634171217792]
AH00491: caught SIGTERM, shutting down
[vagrant@docker1 ~]$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
61c2aeea9410 httpd "httpd-foreground" 30 seconds ago Exited (0) 22 seconds ago
▷ mariadb 를 실행해보자
[vagrant@docker1 ~]$ docker run -d --name mydb mariadb
▷ mariadb 컨테이너가 죽어있다 원인 찾기
[vagrant@docker1 ~]$ docker ps -a --no-trunc
▷ log를 확인
[vagrant@docker1 ~]$ docker logs mydb
>> root 암호가 필요하다는 log 내용이 가장 아래에서 발견됐다
▷ mariadb docker hub 에서 해결 방법을 찾아보자
https://hub.docker.com/_/mariadb
mariadb - Official Image | Docker Hub
mariadb •• MariaDB Server is a high performing open source relational database, forked from MySQL.
hub.docker.com
▷ Docker Hub 에서 확인한 해결 방법
# env 환경변수
docker run --detach --name mydb --env MARIADB_ROOT_PASSWORD=mydb mariadb:latest
docker run --detach --name mydb --env MARIADB_ALLOW_EMPTY_ROOT_PASSWORD=mydb mariadb:latest
docker run --detach --name mydb --env MARIADB_RANDOM_ROOT_PASSWORD=mydb mariadb:latest
>> 직접 접속 가능하다
[vagrant@docker1 ~]$ docker exec -it mydb /bin/bash
▶ docker container layer
▷ docker image 에 있는 Layer 는 수정이 불가능하다
▷ container layer 에서는 수정이 가능하다
# container 를 없애고 다시 image 에서 컨테이너로 올리면, 기존에 해둔 작업은 없어진다
# container 를 지우면 사라짐
◇ Container layer 는 Thin R/W layer / Image Layer 는 R/O
>> 처음 container 를 올리면 용량이 굉장히 작지만, 필요한 것들이 있으면, Image Layer에서 가져와서
>> 점점 용량이 늘어나는 방식이다
https://docs.docker.com/storage/storagedriver/
About storage drivers
Learn the technologies that support storage drivers.
docs.docker.com
▶ container 에 있는 내용을 영구 저장 방법
>> / var / lib / docker 밑에 수정한 index.html 이 존재한다 ( second apache 라는 내용 )
▷ 디렉터리를 만들어서 마운트포인트 ( container 쪽 ) 에 마운트 시키면 된다
# webdata 라는 directory 를 만들어서 / usr / local / apache2 / htdocs 에 마운트 시킨다
# 마운트 했으므로, httpd 올리면 htdocs 디렉터리는 비어있다
▷ 실습
[root@docker1 docker]# docker run -d --volume $(pwd)/webdata:/usr/local/apache2/htdocs \
> --name myapache httpd:2.4
[root@docker1 docker]# docker exec -it myapache /bin/bash
root@57eb3c1142b4:/usr/local/apache2# echo "third apache" > htdocs/index.html
○ 마운트 되어있음을 확인할 수 있다
root@57eb3c1142b4:/usr/local/apache2# df -h -a
/dev/sda1 40G 5.7G 35G 15% /usr/local/apache2/htdocs
● 확인
[root@docker1 docker]# all_container_rm
[root@docker1 docker]# docker run -d --volume $(pwd)/webdata:/usr/local/apache2/htdocs
--name myapache httpd:2.4
[root@docker1 docker]# curl http://172.17.0.3
third apache
◇ mysql 로 다시 한번 실습
# 중요한건 마운트 포인트
# mysql 의 생성 위치는 / var / lib / mysql
# 환경변수 잊지말자
[vagrant@docker1 ~]$ docker run -d --volume $(pwd)/dbstore:/var/lib/mysql
--name mysql --env MYSQL_ROOT_PASSWORD=mysql mysql
ce427d080a9a8505c9607cfafb2c04536eb12ae110ca5b369634fb70ab816020
[vagrant@docker1 ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ce427d080a9a mysql "docker-entrypoint.s…" 2 seconds ago Up 2 seconds 3306/tcp, 33060/tcp mysql
>> dbstore 디렉터리를 확인해보면 이미 mysql 관련된 파일들이 생성되어있다
[vagrant@docker1 ~]$ ls dbstore/
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
▷ 접속하여 생성 확인용 database 생성
[vagrant@docker1 ~]$ docker exec -it mysql /bin/bash
mysql> create database m1
-> ;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| m1 |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
○ 확인
[vagrant@docker1 ~]$ all_container_rm
[vagrant@docker1 ~]$ docker run -d --volume $(pwd)/dbstore:/var/lib/mysql --name mysql
--env MYSQL_ROOT_PASSWORD=mysql mysql
[vagrant@docker1 ~]$ docker exec -it mysql /bin/bash
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| m1 |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
▶ 디렉터리가 없어도 생성이 된다
>> 하지만 자동 생성된 디렉터리는 root 권한으로 만들어 진다
[vagrant@docker1 ~]$ ls
dbstore
[vagrant@docker1 ~]$ docker run -d --name httpd -v
./mydata:/usr/local/apache2/htdocs httpd:2.4
659f635ea2067e72d5e95413dc4c53463199362c045baa1f25743827890dc6b5
[vagrant@docker1 ~]$ ll
total 4
drwxrwxr-x. 8 polkitd vagrant 4096 Mar 4 16:38 dbstore
drwxr-xr-x. 2 root root 6 Mar 4 16:39 mydata
▶ 사용하지 않는 volume 을 지울 때에는 prune 이라는 명령어를 붙여준다
[vagrant@docker1 ~]$ all_container_rm
659f635ea206
659f635ea206
[vagrant@docker1 ~]$ docker volume ls
DRIVER VOLUME NAME
local 0fac444c87e2746077a5839e36a740203e57ad954c86c24596d27eb166825215
local 00fd77eb01d5f000937912ca4e53dc22df5469ead963898f2997004c6421baf1
local d3c511e81ceccc9a884650d81762297cc6276798ae4940ce20d62b4c51f1aa86
local d57068425e31ea16a4dabd39bfbf4050c3719de362a8f00344fffda5537cac00
local e0ff8afdaa2db74821e8673e85f51c56b1341ce91f696b44c5786fff1a0093af
local e10cbaf6829254ff0de5004028b5c0b4cdab43124ac72d2749d830dc9c07e705
[vagrant@docker1 ~]$ docker volume prune
WARNING! This will remove anonymous local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
d3c511e81ceccc9a884650d81762297cc6276798ae4940ce20d62b4c51f1aa86
d57068425e31ea16a4dabd39bfbf4050c3719de362a8f00344fffda5537cac00
e10cbaf6829254ff0de5004028b5c0b4cdab43124ac72d2749d830dc9c07e705
00fd77eb01d5f000937912ca4e53dc22df5469ead963898f2997004c6421baf1
0fac444c87e2746077a5839e36a740203e57ad954c86c24596d27eb166825215
e0ff8afdaa2db74821e8673e85f51c56b1341ce91f696b44c5786fff1a0093af
Total reclaimed space: 567.5MB
▶ docker volume create 로 생성한 volume 은 volume name 으로 경로를 쉽게 지정할 수 있다
>> 그리고 쉽게 저장된 위치를 확인할 수 있다
[vagrant@docker1 ~]$ docker volume create web
web
[vagrant@docker1 ~]$ docker volume ls
DRIVER VOLUME NAME
local web
[vagrant@docker1 ~]$ docker run -d --name myapache -v web:/usr/local/apache2/htdocs httpd:2.4
7cbda376ed54a6531fa273ba74cfcb7e0facbeebc0de29319f9cd540567fa45f
[vagrant@docker1 ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7cbda376ed54 httpd:2.4 "httpd-foreground" 5 seconds ago Up 4 seconds 80/tcp myapache
● 확인
[vagrant@docker1 ~]$ docker run -d --name myapache
-v web:/usr/local/apache2/htdocs httpd:2.4
7cbda376ed54a6531fa273ba74cfcb7e0facbeebc0de29319f9cd540567fa45f
[vagrant@docker1 ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7cbda376ed54 httpd:2.4 "httpd-foreground" 5 seconds ago Up 4 seconds 80/tcp myapache
[vagrant@docker1 ~]$ docker exec -it myapache touch /usr/local/apache2/htdocs/myfile.html
[vagrant@docker1 ~]$ sudo find /var/lib/docker -name myfile.html
/var/lib/docker/volumes/web/_data/myfile.html
>> root 로 index.html 생성
[vagrant@docker1 ~]$ sudo -i
[root@docker1 ~]# echo "heoafhoeafh" > /var/lib/docker/volumes/web/_data/index.html
>> vagrant 로 확인된다
[vagrant@docker1 ~]$ curl http://172.17.0.2
heoafhoeafh
'Docker 와 Container' 카테고리의 다른 글
Dockerfile - EXPOSE / WORKDIR (0) | 2024.03.05 |
---|---|
Dockerfile - ENV / LABEL (0) | 2024.03.05 |
Dockerfile - ENTRYPOINT / CMD (0) | 2024.03.05 |
Docker container >> image / tar 만들기 (0) | 2024.03.05 |
Docker Network (0) | 2024.03.04 |