[Docker] 클라우드와 도커의 시작

gununoo·2022년 8월 17일
23

Docker

목록 보기
1/8
post-thumbnail

클라우드와 도커의 시작

클라우드: 남는 자원을 외부에 제공(그리드 컴퓨팅) + 과금 시스템(유틸리티 컴퓨터)

사설 클라우드 vs 퍼블릭 클라우드

  • 사설 클라우드: openstack, cloudstack, vmware 등
  • 퍼블릭(공인) 클라우드: aws, azure, gcp, softlayer, oracle cloud, ncp 등

클라우드의 특징

  • on-demand: 주문 즉시 사용가능
  • 인터넷 접속이 가능하다면 위치에 상관 없이 24시간 온라인을 유지할 수 있다.
  • 탄력성과 확장성: auto scale을 통해 탄력적으로 서비스의 확장과 축소가 가능하다.
    ex) 인스턴스의 대수를 2대에서 4대로 늘리는 것(수평적 확장, scale out), 디스크의 용량을 10GB에서 20GB로 늘리는 것(수직적 확장, scale up)
    일반적으로 클라우드에서 탄력적/확장성을 말할 때에는 scale out을 지칭한다. 특정 상황이 되면 자동으로 스케일을 확장하도록 설정할 수 있다. -> auto scaling
  • 자원 관리를 풀에 담아서 일괄적으로 처리할 수 있다: 자원의 클러스터화가 가능해야 한다.
  • 자원 사용의 모니터링이 가능해야 한다. 이는 과금 서비스와 연곟여 사용될 수 있다.
  • 24시간 온라인을 유지할 수 있는 애플리케이션(이전에는 downtime이 많았다): 가상머신의 지역간 이동을 통해 구현 가능하게 됨

가상화

  • 서버 가상화: KVM과 같은 하이퍼바이저를 이용하여 가상 서버 형태로 서버를 제공하는 방법
  • 스토리지 가상화: 적은 양의 스토리지를 묶어 하나의 큰 자원풀로 활용하는 것
  • 네트워크 가상화: vlan, vxlan, vpc(virtual private cloud), vrf(virtual routing forwarding, 각 고객사별로 별도의 라우팅 테이블을 제공하는 것)

프로비저닝 및 오케스트레이션

  • 프로비저닝(provisioning): 시스템(네트워크, 스토리지 등)을 즉시 사용할 수 있는 준비 상태로 대기하는 것
    만약 가상서버 10대, 네트워크 준비, 볼륨 준비 등을 일일이 처리한다면 이는 오랜 시간이 걸릴 것이다. 이를 일괄적으로 처리할 수 있는 프로비저닝 도구가 있다.
    대표적으로는 앤서블(Ansible), 셰프(Chef), 베이그런트(Vagrant), 퍼핏(Puppet) 등이 있다. -> 과거에는 일일이 명령을 통해 구현했지만 프로비저닝 도구를 이용한다면 코드를 통해 배포할 수 있다.
  • 배포(deployment): 애플리케이션을 즉시 사용할 수 있는 준비 상태로 대기하는 것
  • 오케스트레이션(orchestration): 시스템 또는 애플리케이션의 묶음을 일괄적으로 배포/프로비전할 수 있으며 이를 회수하는 것.
    일반적으로는 애플리케이션/컨테이너의 관리에 주로 사용하는 용어이며 특히 컨테이너와 관련하여 대표적인 오케스트레이션 도구로는 쿠버네티스가 있다.

클라우드의 구분

출처: https://www.aalpha.net/wp-content/uploads/2020/03/saas-paas-iaas-difference-1.png%3E

  • IaaS: 서버/네트워크/방화벽과 같은 서비스를 제공하기 위한 인프라 환경을 제공하는 것
    ex) OpenStack, ec2, KVM을 인스턴스 형태로 제공한다.
  • PaaS: 개발 환경(데이터베이스, 개발 언어, IDLE 등을 동일한 버전 등으로 제공할 수 있다)
    ex) github, docker, kubernetes 등
  • SaaS: 소프트웨어를 제공한다.
    ex) photoshop 등

클라우드 컴퓨팅 제공 방식

  • 온프레미스: 클라우드와 달리 자체 데이터 센터를 운영하는 것. 자체 솔루션 등을 적용할 수 있어 보안성, 효율성 면에서는 우수하다고 할 수 있다. 단, 현재는 온프레미스 환경에서 이를 사설 클라우드로 전환하는 케이스가 늘고 있다.
  • 사설 클라우드: 대기업/금융권 등의 서버를 자체 데이터센터에서 클라우드를 구축하고 이를 활용하는 방법
  • 하이브리드 클라우드: 퍼블릭과 프라이빗의 결합. 예를 들어 웹서버는 aws에서 제공하고 데이터 보관 서비스는 사설 클라우드를 활용하는 방법

BareMetal vs 가상머신 vs 컨테이너

베어메탈

  • 애플리케이션이 OS 위에 직접 배포된다.

가상머신

  • 하이퍼바이저를 이용하여 가상 서버를 구축하고 해당 서버 위에 애플리케이션이 배치되는 형태로 가상 머신은 각자의 커널을 갖는다.
  • 실제로 애플리케이션이 동작하기 위해서는 guestos -> 커널 -> 하이퍼바이저 -> 커널 -> 물리자원을 거쳐야 하므로 성능 저하가 발생한다.

컨테이너

  • 자신이 속한 os의 커널을 직접 사용하므로 성능 저하가 거의 없다.
  • 도커 엔진 -> 도커에서 이미지와 컨테이너를 관리하는 도구이며 도커의 핵심이다.
  • 사용자 입장에서는 자신이 이용하는 애플리케이션이 가상머신에서 또는 컨테이너에서 동작하는 것은 관심 대상이 아니다. 사용자는 빠른 처리속도만을 요구한다. 최근에는 대부분의 애플리케이션이 잦은 i/o를 요구하므로 컨테이너를 이용하는 경향이 아주 많다. 따라서 성능 저하가 없으면서도 배포가 용이하고 스케일 등의 적용이 쉬운 컨테이너를 이용하는 것이 사용자를 위해서 유리하다.
  • 컨테이너는 가상 머신처럼 물리적 자원을 격리시키는 것이 아니라, 프로세스를 격리시킬 수 있다.
    ex) 컨터이너를 사용한다면 httpd가 설치된 상태에서 추가적으로 httpd를 설치하여 운영할 수 있다.
  • 도커는 리눅스에서 사용하던 기술인 namespace(프로세스 자원 관리; 격리), cgroup(자원 사용 제한)을 이용하여 개발되었다.
  • 도커의 namespace는 아래와 같은 리눅스의 네임스페이스를 차용하여 만들었다.
  1. user namespace: 사용자 또는 그룹별로 격리
  2. UTS(unix time-sharing) namespace: 응용프로그램 입장에서 호스트명과 도메인에 대한 분리된 가시성을 제공
  3. 마운트 네임스페이스: 프로세스에서 마운트된 파일 시스템에 대한 가시성을 제공하기 위해 자신만의 마운트 네임 스페이스를 사용할 수 있다. 각각의 컨테이너에서 별도의 호스트 디렉토리를 마운트할 수 있다.
  4. PIP 네임스페이스: Process ID는 호스트 상의 다른 응용프로그램으로부터 격리될 수 있다. 이를 통해 동일한 애플리케이션이 동시에 2개 이상 동작하는 것도 가능하다.
  5. 네트워크 네임스페이스: 네트워크 인터페이스, 라우팅 테이블 등에 대한 격리 가능하다.

CI/CD

  • 기존에는 코드의 변경 사항을 일괄적으로 모아 한꺼번에 서버에 올리는 형식이였다면 이제는 각 개발자가 자신이 담당하는 코드를 github/gitlab에 push하면 이를 감지한 CD(gitlab, jenkins)가 컨테이너에 이를 실시간(비정기적, 정기적(cron))으로 이를 컨테이너에 반영한다.
    gitlab은 설치형 오픈소스로도 제공된다.
  • 쿠버네티스는 컨테이너를 생성하는 runtime이 아니다!
  • 컨테이너를 생성하는 runtime에는 containerd, cri-o, rkt, podman 등이 있다.
  • 쿠버네티스는 사실상 표준으로 취급된다. -> ECS, EKS, GKE
  • 쿠버네티스와는 달리 runtime으로 도커만을 사용하는 오케스트레이션 툴도 있다 -> swarm

컨테이너 이미지

컨테이너 생성을 위해서는 이를 위한 이미지가 필요하다. 이미지는 정적인 파일이며 수정이 된다면 수정된 이미지를 이용한 모든 컨테이너는 변경된 내용이 반영된 상태에서 배포된다.

컨테이너는 이미지로 부터 받은 내용을 토대로 생성되고 추가된 내용은 영구적으로 보관되지 않는다. 영구적인 보관이 필요하다면 별도의 volume 을 이용하여 데이터를 보관할 수 있다.

이미지가 보관되는 장소(registry)

  • local registry : 도커가 설치되어 있는 내 컴퓨터
  • private registry
    1)지정된 사용자/그룹의 접근만을 허용하는 저장소. aws,azure,gcp 와 같은 퍼블릭 클라우드 환경에서 특정 사용자/계정/프로젝트만을 위한 저장소
    2) dockerhub 에서 저장소를 생성할 때 private 으로 생성하게되면 지정된 사용자들만 접속할 수 있다.
    3) registry 컨테이너를 이용하여 회사내에 자체적으로 사설 저장소를 구현할 수 있다.
  • public registry : 모든 사용자들이 접근하고 이미지를 다운받을 수 있는 곳. dockerhub

이미지로부터 컨테이너를 생성하는 과정

1) docker container run --name httpd01 .... httpd (명령어 입력)
2) 로컬에 httpd 이미지가 있는지 여부를 확인하고 없다면 public registry 로 접속하여 httpd 최신 버전을 로컬 레지스트리로 다운로드 한다.
3) 로컬 레지스트리에 저장된 이미지를 이용하여 컨테이너 생성
4) 생성된 컨테이너를 실행

컨테이너의 종류

  1. os 컨테이너
  2. 애플리케이션 컨테이너

도커 실습 - httpd, nginx

도커 환경 구성

sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
apt-cache policy docker-ce  # 설치가능 버전 확인
sudo apt install docker-ce    # 지원되는 최신 버전으로 설치
sudo systemctl status docker
sudo usermod -aG docker rapa  # rapa 계정을 docker 그룹에 포함, sudo 없이 docker 명령 사용할 수 있음
groups rapa
sudo ufw disable # 방화벽 해제

로그인 방법

https://hub.docker.com/
1) username/password
2) username/token
토큰 방식이 더 안전함
account settings -> security -> new access token


step 1. 퍼블릭에 있는 이미지를 로컬 레지스트리로 pull 하기

rapa@rapa:~$ docker pull centos:7
7: Pulling from library/centos
2d473b07cdd5: Pull complete 
Digest: sha256:c73f515d06b0fa07bb18d8202035e739a494ce760aa73129f60f4bf2bd22b407
Status: Downloaded newer image for centos:7
docker.io/library/centos:7
rapa@rapa:~$ uname -nr
rapa 5.15.0-46-generic

step 2. 컨테이너 배포하기

rapa@rapa:~$ docker container run -it \
> --name centos01 \
> --hostname centos1 \
> centos:7 /bin/bash
[root@centos1 /]# 

-it: os로 접속

커널 확인

[root@centos1 /]# uname -a 
Linux centos1 5.15.0-46-generic #49~20.04.1-Ubuntu SMP Thu Aug 4 19:15:44 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
[root@centos1 /]# 

centos7 os 컨테이너는 본인의 커널이 없고, 20.04.1-Ubuntu의 커널을 사용한다.

step 3. 접속된 컨테이너에서 나가기

1. exit

컨테이너를 종료하고 빠져나오기

[root@centos1 /]# exit
exit
rapa@rapa:~$ 

동작 중인 컨테이너 확인

rapa@rapa:~$ docker container ls
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
rapa@rapa:~$ 

모든 컨테이너 확인

rapa@rapa:~$ docker container ls --all
CONTAINER ID   IMAGE      COMMAND       CREATED             STATUS                        PORTS     NAMES
940157cd2ae9   centos:7   "/bin/bash"   About an hour ago   Exited (127) 59 seconds ago             centos01

중지 상태인 컨테이너 시작하기

rapa@rapa:~$ docker start centos01
centos01
rapa@rapa:~$ 

컨테이너 내부에 진입하기

rapa@rapa:~$ docker attach centos01
[root@centos1 /]#   

2. ctrl + p, q

컨테이너를 종료하지 않고 빠져나오기

[root@centos1 /]# read escape sequence
rapa@rapa:~$ 

동작 중인 컨테이너 확인

rapa@rapa:~$ docker container ls
CONTAINER ID   IMAGE      COMMAND       CREATED             STATUS         PORTS     NAMES
940157cd2ae9   centos:7   "/bin/bash"   About an hour ago   Up 2 minutes             centos01
rapa@rapa:~$ 

step 4. nginx 이미지 다운로드하기

docker hub에 있는 nginx 최신 이미지를 로컬 저장소에 pull하기

rapa@rapa:~$ docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
1efc276f4ff9: Pull complete 
baf2da91597d: Pull complete 
05396a986fd3: Pull complete 
6a17c8e7063d: Pull complete 
27e0d286aeab: Pull complete 
b1349eea8fc5: Pull complete 
Digest: sha256:790711e34858c9b0741edffef6ed3d8199d8faa33f2870dea5db70f16384df79
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

도커 이미지 보기

rapa@rapa:~$ docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
nginx        latest    b692a91e4e15   2 weeks ago     142MB
centos       7         eeb6ee3f44bd   11 months ago   204MB

step 5. nginx 배포하기

rapa@rapa:~$ docker container run -d \
> --name nginx01 \
> -p 8001:80 \
> nginx 
c3aa3652db3040317f64a453bbef6b30726ba8a4e42e6c4ee517c0fb18d82082

run: 생성하고 실행까지 함(create + start)

-d: 백그라운드에서 동작
-p 8001:80: 우분투(host)의 8001번 포트로 접속하면 컨테이너의 80번 포트로 연결함(정적 PAT)

동작 중인 컨테이너 확인

rapa@rapa:~$ docker container ls
CONTAINER ID   IMAGE      COMMAND                  CREATED          STATUS          PORTS                                   NAMES
c3aa3652db30   nginx      "/docker-entrypoint.…"   54 seconds ago   Up 53 seconds   0.0.0.0:8001->80/tcp, :::8001->80/tcp   nginx01
940157cd2ae9   centos:7   "/bin/bash"              2 hours ago      Up 11 minutes                                           centos01
rapa@rapa:~$ ifconfig ens32
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 211.183.3.137  netmask 255.255.255.0  broadcast 211.183.3.255
        inet6 fe80::a0f:30a8:48a:1785  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:16:8d:3f  txqueuelen 1000  (Ethernet)
        RX packets 419773  bytes 621498158 (621.4 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 118788  bytes 7460816 (7.4 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens32의 ip는 211.183.3.137이다.
211.183.3.137:8001로 접속

step 6. httpd 실행하기

rapa@rapa:~$ docker container run -d \
> --name httpd01 \
> -p 8002:80 \
> httpd
Unable to find image 'httpd:latest' locally
latest: Pulling from library/httpd
1efc276f4ff9: Already exists 
aed046121ed8: Pull complete 
4340e7be3d7f: Pull complete 
80e368ef21fc: Pull complete 
80cb79a80bbe: Pull complete 
Digest: sha256:343452ec820a5d59eb3ab9aaa6201d193f91c3354f8c4f29705796d9353d4cc6
Status: Downloaded newer image for httpd:latest
66902df7e5a9f499bbdc8ce9885c881a7fade2a764f9a0cbeaf567898daa6030
rapa@rapa:~$ 

211.183.3.137:8002로 접속

rapa@rapa:~$ docker attach httpd01
211.183.3.1 - - [17/Aug/2022:05:05:40 +0000] "-" 408 -
^C[Wed Aug 17 05:06:01.061911 2022] [mpm_event:notice] [pid 1:tid 140563006467392] AH00491: caught SIGTERM, shutting down
rapa@rapa:~$ 

attach 되지 않는다.
httpd는 외부 연결용(console) 인터페이스가 없기 때문에 attach할 수 없다.

rapa@rapa:~$ docker container ls
CONTAINER ID   IMAGE      COMMAND                  CREATED         STATUS          PORTS                                   NAMES
c3aa3652db30   nginx      "/docker-entrypoint.…"   9 minutes ago   Up 9 minutes    0.0.0.0:8001->80/tcp, :::8001->80/tcp   nginx01
940157cd2ae9   centos:7   "/bin/bash"              2 hours ago     Up 19 minutes                                           centos01
rapa@rapa:~$ docker container start httpd01
httpd01

rapa@rapa:~$ docker container exec httpd01 env
PATH=/usr/local/apache2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=66902df7e5a9
HTTPD_PREFIX=/usr/local/apache2
HTTPD_VERSION=2.4.54
HTTPD_SHA256=eb397feeefccaf254f8d45de3768d9d68e8e73851c49afd5b7176d1ecf80c340
HTTPD_PATCHES=
HOME=/root
rapa@rapa:~$ 

exec [컨테이너 이름]: 외부 연결용 인터페이스가 없는 경우에는 외부 클라이언트에서 컨테이너에게 명령을 전달하고 결과를 외부에서 받을 수 있다.
exec을 사용하면 컨테이너 내부로 직접 들어가지 않아도 컨테이너의 명령을 외부에서 전달하여 결과를 확인할 수 있다.


도커 명령어

docker container run: 컨테이너 생성 + 컨테이너 실행
docker container ls --all: 동작 또는 중지 중인 모든 컨테이너의 리스트 확인 가능
docker image ls: 로컬 저장소에 보관된 이미지의 리스트를 확인할 수 있다.
docker container exec: 컨테이너에게 명령을 전달하고 결과를 호스트에서 확인할 수 있다.
docker container attach: 외부 연결용(console) 인터페이스가 있는 경우에는 컨테이너로 직접 들어갈 수 있다.

Quiz

httpd를 이용하여 추가 웹서버를 실행해보세요!

rapa@rapa:~$ docker container run -d \
> --name httpd02 \
> -p 8003:80 \
> httpd
dbc685661068bc54dcac23c60ff7f466dca995cae37f84073fab133b0a68af91
rapa@rapa:~$ 

211.183.3.137:8003 접속

step 7. 웹페이지 수정하기

index.html 파일 생성

rapa@rapa:~$ touch index.html 
rapa@rapa:~$ curl https://www.naver.com > index.html 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  241k    0  241k    0     0  1644k      0 --:--:-- --:--:-- --:--:-- 1633k

httpd 컨테이너 생성 (포트 8080)

rapa@rapa:~$ docker container run -d \
> --name httpd80 \
> -p 8080:80 \
> -v /home/rapa:/usr/local/apache2/htdocs \
> httpd
af4cc93f97f52a1e881e636c6d4fb97e14744a64d931fa3dd39c19f87a8e5d3b

localhost:8080 접속

httpd 컨테이너 생성 (포트 8888)

rapa@rapa:~$ docker container run -d --name httpd8888 -p 8888:80 -v /home/rapa:/usr/local/apache2/htdocs httpd
eb50e604c96b972f365f239400eaa8e0ff5f7daf298ae22e824803ea5335143d

localhost:8888 접속

index.html 파일 수정

rapa@rapa:~$ echo "hello" > index.html

localhost:8080, :8888 접속


이미지 저장소(Registry)

저장소: 이미지가 보관되는 곳(registry, repository)

public registry

  • 불특정 다수가 접근하여 이미지를 사용할 수 있는 public registry: docker hub
  • docker search python이라고 하면 도커 허브에 연결하여 퍼블릭 저장소에 보관된 공개된 모든 이미지룰 검색/pull할 수 있다. 첫 번째 검색 결과는 항상 공식 이미지이다. 공식 이미지는 별도의 계정 정보가 보이지 않는다. 하지만 public registry에 공개된 이미지는 id/python과 같이 출력된다.

private registry

  • 특정 사용자/그룹만 접근하여 이미지를 사용할 수 있는 private registry (별도의 프로젝트를 진행하는 경우에 사용한다)
  1. 도커 허브에 repository를 만들 때 private로 만들고 접속 허용하고자 하는 id를 지정한다.
  2. aws, gcp, azure와 같이 vpc 환경에서 작업하는 경우에도 사설 저장소를 운영할 수 있다.
  3. 우리 회사 내, 우리 강의장에 별도의 서버를 하나 준비하고 해당 서버에 registry라는 이미지를 이용하여 사설 저장소를 운영할 수 있는 컨테이너를 생성한다.

local registry

  • 나 혼자만 접속할 수 있는 local registry
  • 내 컴퓨터 자체에 이미지를 보관할 수 있는 공간이 있는데 여기를 로컬 저장소라고 하며 컨테이너 생성 시에는 1차적으로 이 로컬 저장소에서 이미지를 검색하게 된다. 만약 없다면 도커 허브로 연결한다.

도커 명령어


출처: http://docker-saigon.github.io/post/Docker-Internals/

컨테이너 생성

  • docker container run: 생성 + 시작
  • docker container create: 생성만 됨

컨테이너 삭제

  • docker container stop + docker container rm
  • docker container rm -f

생성된 컨테이너에 연결하기

  • docker container attach

생성된 컨테이너에 명령 전달하기

  • docker container exec [컨테이너 이름][명령]

이미지 pull 하기

  • docker pull httpd : 도커허브에서 제공되는 공식 이미지 중 최신
  • docker pull centos:7 : 도커허브 공식 centos 이미지 중 7버전

컨테이너 리스트

  • docker container ls --all

이미지 리스트

  • docker image ls

컨테이너 삭제하기

컨테이너 리스트 출력

rapa@rapa:~$ docker container ls --all
CONTAINER ID   IMAGE      COMMAND                  CREATED             STATUS             PORTS                                   NAMES
eb50e604c96b   httpd      "httpd-foreground"       39 minutes ago      Up 39 minutes      0.0.0.0:8888->80/tcp, :::8888->80/tcp   httpd8888
af4cc93f97f5   httpd      "httpd-foreground"       41 minutes ago      Up 41 minutes      0.0.0.0:8080->80/tcp, :::8080->80/tcp   httpd80
dbc685661068   httpd      "httpd-foreground"       50 minutes ago      Up 50 minutes      0.0.0.0:8003->80/tcp, :::8003->80/tcp   httpd02
66902df7e5a9   httpd      "httpd-foreground"       About an hour ago   Up 56 minutes      0.0.0.0:8002->80/tcp, :::8002->80/tcp   httpd01
c3aa3652db30   nginx      "/docker-entrypoint.…"   About an hour ago   Up About an hour   0.0.0.0:8001->80/tcp, :::8001->80/tcp   nginx01
940157cd2ae9   centos:7   "/bin/bash"              3 hours ago         Up About an hour     

컨테이너의 id를 입력하여 삭제하기

rapa@rapa:~$ docker container rm eb50e604c96b
Error response from daemon: You cannot remove a running container eb50e604c96b972f365f239400eaa8e0ff5f7daf298ae22e824803ea5335143d. Stop the container before attempting removal or force remove

-> 중지 후 삭제하거나 강제 삭제해야 함

강제 삭제하기

rapa@rapa:~$ docker container rm -f eb50e604c96b 
eb50e604c96b

컨테이너 아이디만 출력

rapa@rapa:~$ docker container ls --all -q
af4cc93f97f5
dbc685661068
66902df7e5a9
c3aa3652db30
940157cd2ae9

모든 컨테이너 삭제하기

rapa@rapa:~$ docker container rm -f $(docker container ls --all -q)
af4cc93f97f5
dbc685661068
66902df7e5a9
c3aa3652db30
940157cd2ae9

rapa@rapa:~$ docker container ls --all 
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

도커 이미지 관련 명령어

도커 이미지 리스트

rapa@rapa:~$ docker image ls 
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
nginx        latest    b692a91e4e15   2 weeks ago     142MB
httpd        latest    f2a976f932ec   2 weeks ago     145MB
centos       7         eeb6ee3f44bd   11 months ago   204MB

이미지 inspect하기

rapa@rapa:~$ docker image inspect b692a91e4e15 
[
    {
        "Id": "sha256:b692a91e4e1582db97076184dae0b2f4a7a86b68c4fe6f91affa50ae06369bf5",
        "RepoTags": [
            "nginx:latest"
        ],
        "RepoDigests": [
            "nginx@sha256:790711e34858c9b0741edffef6ed3d8199d8faa33f2870dea5db70f16384df79"
        ],
        "Parent": "",
...
  • cmd: 해당 이미지를 이용하여 컨테이너로 배포하면 처음 시작되는 명령
            "Cmd": [
                "nginx",
                "-g",
                "daemon off;"
            ],
  • Entrypoint: cmd와 비슷하게 처음 컨테이너가 실행되면 동작시키는 명령어
          "Entrypoint": [
                "/docker-entrypoint.sh"
            ],
  • Layer
    • 처음 만든 도커 이미지를 기준으로 추가되는 내용을 레이어 형태로 얹게 된다.
    • 최초 이미지를 base로 하여 추가되는 내용만 가져온다.
"RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:92a4e8a3140f7a04a0e5a15793adef2d0e8889ed306a8f95a6cfb67cecb5f212",
                "sha256:e3257a399753c995f54856b0cea3c2b6aa1a95d9a7b542668a46fa4eacf62d53",
                "sha256:3a89c8160a43d70433241934b1d418f641e6d207a10b558b67f8aafdb15416b0",
                "sha256:f91d0987b144553456431bcb8cc8ddf5d03362701bc2ffc128ce2bd57182defb",
                "sha256:bdc7a32279ccdf5aba13d3e50b7b16103e03ff8ef27424ac1a33df24e5a9f602",
                "sha256:b539cf60d7bb42871a005e949b550800b99fada0b1c1bca01654e8a506ba2138"
            ]
        },

이미지 push하기

rapa@rapa:~$ docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
nginx        latest    b692a91e4e15   2 weeks ago     142MB
httpd        latest    f2a976f932ec   2 weeks ago     145MB
centos       7         eeb6ee3f44bd   11 months ago   204MB
 
rapa@rapa:~$ docker image tag nginx:latest ptah0414/mynginx:blue
rapa@rapa:~$ docker image tag nginx:latest ptah0414/mynginx:green

rapa@rapa:~$ docker image ls
REPOSITORY         TAG       IMAGE ID       CREATED         SIZE
nginx              latest    b692a91e4e15   2 weeks ago     142MB
ptah0414/mynginx   blue      b692a91e4e15   2 weeks ago     142MB
ptah0414/mynginx   green     b692a91e4e15   2 weeks ago     142MB
httpd              latest    f2a976f932ec   2 weeks ago     145MB
centos             7         eeb6ee3f44bd   11 months ago   204MB

도커 이미지는 layer로 관리되기 때문에 blue, green 태그로 생성한 이미지는 nginx의 이미지와 id가 동일하다.

  • blue와 green 이미지를 도커 허브에 push하기

    docker push ptah0414/mynginx:blue

rapa@rapa:~$ docker push ptah0414/mynginx:blue
The push refers to repository [docker.io/ptah0414/mynginx]
b539cf60d7bb: Mounted from library/nginx 
bdc7a32279cc: Mounted from library/nginx 
f91d0987b144: Mounted from library/nginx 
3a89c8160a43: Mounted from library/nginx 
e3257a399753: Mounted from library/nginx 
92a4e8a3140f: Mounted from library/httpd 
blue: digest: sha256:f26fbadb0acab4a21ecb4e337a326907e61fbec36c9a9b52e725669d99ed1261 size: 1570
rapa@rapa:~$ docker push ptah0414/mynginx:green
The push refers to repository [docker.io/ptah0414/mynginx]
b539cf60d7bb: Layer already exists 
bdc7a32279cc: Layer already exists 
f91d0987b144: Layer already exists 
3a89c8160a43: Layer already exists 
e3257a399753: Layer already exists 
92a4e8a3140f: Layer already exists 
green: digest: sha256:f26fbadb0acab4a21ecb4e337a326907e61fbec36c9a9b52e725669d99ed1261 size: 1570


이미지를 만드는 방법

  1. 동작 중인 컨테이너를 commit하여 이미지로 만든다
  2. Dockerfile을 이용하여 베이스 이미지 지정, 추가 패키지 선택, 컨테이너로 동작 시 실행할 명령어 등을 지정한 뒤 이를 build하면 로컬 저장소에 이미지가 생성된다.

docker container run 옵션들

  • -i: 대화식 모드 열기(interactive)
  • -t: 단말 디바이스 제공(tty). 마치 ssh로 접속하는 것과 같다
  • -it: 접속하여 대화식 모드 열기
  • -d: 생성된 컨테이너를 백그라운드에서 동작시킨다(detach). 데이터베이스나 웹서버와 같이, 생성된 컨테이너로 관리자가 즉시 진입할 필요가 없는 경우에 많이 사용한다.
  • --name: 생성된 컨테이너는 기본적으로 id를 부여받고, 이 중 12자리를 이용하여 관리할 수 있다. 하지만 간단히 이름을 이용하여 관리하고자 하는 경우에는 --name을 이용하여 컨테이너의 이름을 부여할 수 있다. rename을 이용하여 나중에 변경할 수 있다. 단, 동시에 다수의 컨테이너(동일한 기능을 수행)를 생성하는 경우에는 이름을 지정하는 것이 불필요하다. 만약 이름을 부여하지 않으면 자동으로 임의의 이름을 부여하게 된다.
  • --hostname: 컨테이너 내에서 사용하는 컨테이너의 호스트 이름. 호스트명을 지정하지 않으면 자동으로 id값이 호스트 이름으로 사용된다.
  • --rm: 삭제
  • --env: 컨테이너 내에서 사용할 시스템 환경 변수를 지정할 수 있다.
  • -v 또는 --volume: 볼륨 마운트. 호스트의 특정 디렉토리와 컨테이너의 특정 디렉토리를 마운트할 때나, 별도의 볼륨을 만들어서 연결하는 방식으로 사용된다.
    ex) -v /home/rapa:/usr/local/apache2/htdocs -> host의 /home.rapa 디렉토리를 container의 /usr/local/apache2/htdocs에 NFS 방식으로 마운트함. NFS는 shared storage이기 때문에, 다른 컨테이너들과도 동시에 공유할 수 있다.
    일반적으로 파일 스토리지와 볼륨 스토리지를 구분할 때, 파일 스토리지는 절대 경로를 사용하고 볼륨 스토리지는 상대 경로로 작성한다.
    nfs 마운트: /home/rapa:/home/root
    볼륨 마운트: myvolume:/root
  • -p(소문자): 호스트의 특정 포트와 컨테이너의 '특정' 포트를 매핑할 때 사용한다. (주로 사용한다)
  • -P(대문자): 컨테이너에서 노출한 특정 포트를 호스트의 임의의 포트와 '자동' 매핑시켜준다.
  • --link: 두 개 이상의 컨테이너를 연결하는 방법으로, 이름을 이용한 링킹이 가능하다. 주로 외부에 노출되지 않은 데이터베이스와 같은 경우 웹 컨테이너와 연결할 때 사용한다.

데이터베이스를 사용하는 방법

  1. 서버를 준비한다 -> os를 설치한다 -> mysql을 설치한다(bare metal)
  2. aws에 가서 rds 서비스를 신청한다
    애플리케이션의 설치 과정 없이 신청 즉시 해당 애플리케이션으로 접속할 수 있는 서비스 -> 완전 관리형 서비스
  3. 도커를 이용하여 신청한다. 즉시 제공된다. 만약 모든 개발자들이 동일 버전의 개발 환경이 필요하다면 컨테이너를 이용한 개발이 유용하다.

도커 실습 - mysql 배포하기

백그라운드로 동작해야 함(-d)
root 패스워드: test123
기본 데이터베이스: testdb
외부에 공개할 포트: 기본적으로 컨테이너는 3306/tcp를 이용하여 외부에 노출된다. 우리는 호스트의 33061번 포트를 통해 해당 DB로 접근할 수 있어야 한다.
컨테이너의 이름: mydb

mysql 환경 변수 입력하는 법
https://hub.docker.com/_/mysql

우분투(host)에 mysql-client 설치하기

rapa@rapa:~$ sudo apt -y install mysql-client-core-8.0
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following NEW packages will be installed:
  mysql-client-core-8.0
0 upgraded, 1 newly installed, 0 to remove and 227 not upgraded.
Need to get 4,521 kB of archives.
After this operation, 67.3 MB of additional disk space will be used.
Get:1 http://kr.archive.ubuntu.com/ubuntu focal-updates/main amd64 mysql-client-core-8.0 amd64 8.0.30-0ubuntu0.20.04.2 [4,521 kB]
Fetched 4,521 kB in 14s (326 kB/s)                                                                                                                                                                            
Selecting previously unselected package mysql-client-core-8.0.
(Reading database ... 162091 files and directories currently installed.)
Preparing to unpack .../mysql-client-core-8.0_8.0.30-0ubuntu0.20.04.2_amd64.deb ...
Unpacking mysql-client-core-8.0 (8.0.30-0ubuntu0.20.04.2) ...
Setting up mysql-client-core-8.0 (8.0.30-0ubuntu0.20.04.2) ...
Processing triggers for man-db (2.9.1-1) ...
  • mysql 5.7 pull해오기
rapa@rapa:~$ docker pull mysql:5.7 
5.7: Pulling from library/mysql
66fb34780033: Pull complete 
ef4ccd63cdb4: Pull complete 
d6f28a94c51f: Pull complete 
7feea2a503b5: Pull complete 
71dd5852ecd9: Pull complete 
2ff5c3b24fd5: Pull complete 
88a546386a61: Pull complete 
65b18297cf83: Pull complete 
d64f23335fb8: Pull complete 
6ba4171261fa: Pull complete 
96dcc6c8de93: Pull complete 
Digest: sha256:b3a86578a582617214477d91e47e850f9e18df0b5d1644fb2d96d91a340b8972
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

mysql 컨테이너 배포

rapa@rapa:~$ docker run -d \
> --name mydb \
> -e MYSQL_ROOT_PASSWORD=test123 \
> -e MYSQL_DATABASE=testdb \
> -p 33061:3306 \
> mysql:5.7
32bff255deb0038697e875731eb80a451c4a4772bbe80ad5e0d3cdb19d816f3b

컨테이너의 db에 접속

rapa@rapa:~$ mysql testdb -u root -P 33061 -h 127.0.0.1 -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.30 MySQL Community Server - GPL

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
  • 컨테이너 삭제
rapa@rapa:~$ docker container rm -f mydb 
mydb

로컬과 마운트 설정하여 mysql 컨테이너 배포

rapa@rapa:~$ docker container run -d \
> --name mydb \
> -e MYSQL_ROOT_PASSWORD=test123 \
> -e MYSQL_DATABASE=testdb \
> -p 33061:3306 \
> -v /home/rapa/mydb:/var/lib/mysql \
> --restart=always \
> mysql:5.7
1c838204517589dcdb3c4c9f5d23efef292a6d4653f8e346d3ad2255d7f215d6

-v: 로컬과 컨테이너 마운트
--restart=always를 사용하면 데몬이 실행될 때 자동으로 해당 컨테이너를 실행시킨다.

  • 로컬에서 컨테이너와의 마운트 확인
rapa@rapa:~$ cd mydb/
rapa@rapa:~/mydb$ sudo ls testdb/
db.opt

생성한 데이터베이스(testdb) 확인

rapa@rapa:~$ mysql testdb -u root -P 33061 -h 127.0.0.1 -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.39 MySQL Community Server (GPL)

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| testdb             |
+--------------------+
5 rows in set (0.00 sec)

mysql> exit;
Bye
rapa@rapa:~$ 

재부팅 후 컨테이너 확인

rapa@rapa:~$ init 6

rapa@rapa:~$ docker container ls
CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS          PORTS                                                    NAMES
1c8382045175   mysql:5.7   "docker-entrypoint.s…"   3 minutes ago   Up 19 seconds   33060/tcp, 0.0.0.0:33061->3306/tcp, :::33061->3306/tcp   mydb

--restart=always 옵션으로 인해 재부팅되어도 컨테이너가 실행됨

도커 실습 - wordpress, mysql 구성

mysql 컨테이너(wpdb) 배포

rapa@rapa:~$ docker container run -d \
> --name wpdb \
> -e MYSQL_ROOT_PASSWORD=password \
> -e MYSQL_DATABASE=wordpress \
> --restart=always \
> mysql:5.7
ee334749beb715607de79617cb0a003ee8b8488a81bdb74d5ef254cce9f32b9f

mysql 컨테이너는 외부에 공개를 안 할 것이기 때문에 -p 포트 옵션을 주지 않음

wordpress 컨테이너(wordpress) 배포

rapa@rapa:~$ docker container run -d \
> -e WORDPRESS_DB_PASSWORD=password \
> -e WORDPRESS_DB_NAME=wordpress \
> -e WORDPRESS_DB_USER=root \
> --name wordpress \
> --link wpdb:mysql \
> -p 80:80 \
> wordpress
Unable to find image 'wordpress:latest' locally
latest: Pulling from library/wordpress
1efc276f4ff9: Already exists 
3239fd0772e9: Pull complete 
52ccb8ba6c06: Pull complete 
e907707b68ee: Pull complete 
f001901b2b66: Pull complete 
3926f8e80674: Pull complete 
abc6b8b3381c: Pull complete 
f2aef5a590dd: Pull complete 
4739a6591a8b: Pull complete 
1c4c634ab8e6: Pull complete 
d84f48c0548d: Pull complete 
774f9d29e73c: Pull complete 
06e87fefb4ab: Pull complete 
382fb5566e86: Pull complete 
b3b5294242c6: Pull complete 
730f2c6e6033: Pull complete 
019b868fd241: Pull complete 
a217ccc0a4bc: Pull complete 
8f70b51d2ae5: Pull complete 
6c2fa69a7ed1: Pull complete 
6a8eb3d78340: Pull complete 
Digest: sha256:461fb4294c0b885e375c5d94521442fce329cc02ef3f49a8001ea342d14ab71a
Status: Downloaded newer image for wordpress:latest
ed23beec1eaf36167415fc8835f881696a1c1ed838bba898de208d2b4d45ee5f
  • --link wpdb:mysql : wpdb 컨테이너와 링크 설정함. wpdb를 mysql이라고 부를 것임(alias)
  • 80번 포트를 통해 wordpress 컨테이너를 외부에 공개할 것임.

localhost:80 접속

글 작성도 된다

profile
take a look

2개의 댓글