티스토리 뷰

Docker 와 Container

Docker 의 기본

looeon 2024. 3. 4. 09:50

● 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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/04   »
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
글 보관함