728x90

1. 도커 정의
도커는 리눅스 상에서 컨테이너 방식으로 프로세스를 격리해서 실행하고 관리할 수 있도록 도와주며, 
계층화된 파일 시스템에 기반해 효율적으로 이미지(프로세스 실행 환경)을 구축할 수 있도록 해줍니다. 
도커를 사용하면 이 이미지를 기반으로 컨테이너를 실행할 수 있으며, 다시 특정 컨테이너의 상태를 변경해 이미지로 만들 수 있습니다. 
이렇게 만들어진 이미지는 파일로 보관하거나 원격 저장소를 사용해 쉽게 공유할 수 있으며, 
도커만 설치되어 있다면 필요할 때 언제 어디서나 컨테이너로 실행하는 것이 가능합니다.

# 컨테이너는 프로세스의 실행 환경을 격리한다.
  가상머신의 역할을 넘어서 어느 플랫폼에서나 특정한 상태를 그대로 재현가능한 애플리케이션 컨테이너를 관리하는 도구
  운영체제 상에서 지원하는 방법을 통해서 하나의 프로세스(컨테이너)를 실행하기 위한 별도의 환경을 구축하는 일을 지원함.
<프로세스를 격리시켜 실행해주는 도구>

2. 도커 실행 예제
$ docker run -it --rm centos:latest bash
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
8d30e94188e7: Pull complete
Digest: sha256:2ae0d2c881c7123870114fb9cc7afabd1e31f9888dac8286884f6cf59373ed9b
Status: Downloaded newer image for centos:latest

[root@881189373f8b /]# 
[root@881189373f8b /]# cat /etc/redhat-release
CentOS Linux release 8.1.1911 (Core)

3. 도커 설치하기
개발환경에서는 도커 포 맥과 도커 포 윈도우를 사용한다.

리눅스 환경에서는 각 배포판에서 제공하는 패키지 관리자를 사용해서 도커를 설치할 수 있다.

* curl이 없다면 sudo apt-get curl로 설치한다.
$ curl -s https://get.docker.com | sudo sh

패키지 관리자에서 도커에서 관리하는 저장소를 추가하고 docker-engine 패키지를 설치한다.

https://get.docker.com을 직접 열어서 스크립트 파일 내용을 확인한다.

*버전 확인

$docker -v

$ cat /etc/apt/sources.list.d/docker.list
deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable

$ dpkg --get-selections | grep docker
docker-ce                                       install
docker-ce-cli                                   install

* docker 엔진 및 클라이언트
docker-ce , docker-ce-cli

* 현재 실행중인 모든 컨테이너 목록을 출력한다.
$ docker ps 
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/json: dial unix /var/run/docker.sock: connect: permission denied

* 관리자 권한으로 실행
$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

* docker 그룹에 사용자를 추가한다.
$ sudo usermod -aG docker $USER
$ sudo su - $USER

* sudo 명령 없이도 도커 명령어를 사로 사용할 수 있다.
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

4. 도커 이미지 기초 (docker image)
이미지는 가상머신에서 사용하는 이미지와 비슷한 역할을 한다.

[중요] 이미지는 어떤 어플리케이션을 실행하기 위한 환경이다.
이 환경은 파일들의 집합이다.

도커에서는 애플리케이션을 실행하기 위한 파일들을 모아놓고, 애플리케이션과 함께 이미지로 만들 수 있다.
이 이미지를 기반으로 애플리케이션을 배포한다.

1) 도커 레지스트리에서 centos 이미지를 PULL 받는다.
2) 이 이미지를 통해 컨테이너를 실행한다.

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

도커에서는 docker pull <IMAGE_NAME> 명령어로 이미지를 풀 받을 수 있다.

$ docker pull centos
Using default tag: latest
latest: Pulling from library/centos
8a29a15cefae: Pull complete
Digest: sha256:fe8d824220415eed5477b63addf40fb06c3b049404242b31982106ac204f6700
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest

이미지 이름은 :을 구분자로 이미지 이름과 태그로 구분한다.
centos는 centos:latest와 같다.
도커는 먼저 이 이미지를 로컬에서 찾아보고 찾을 수 없으면 토커 공식 저장소에서 찾는다.
저장소에 해당하는 이미지가 존재하면 이미지 pull을 받아온다.
Downloaded newer image for centos:latest centos:latest  이미지가 다운로드 된 것을 알 수 있다.
(별다른 설정 없이 공식 저장소를 통해 이미지를 받아올 수 있다)
예를 들면 리눅스에서 apt, yum이고,
프로그래밍 언어에서는 gem, cpan, pip 같은 패키지다.

* 도커에서는 이미지를 다운 받을 때 install 혹은 download 같은 명령 대신 pull을 사용함.
  이미지를 업로드 할때는  push 명령어를 사용하고,
  새로운 이미지를 생성할 때는 commit을 쓰며,
  이미지의 차이를 확인 할 때는 diff 명령을 사용한다.

* 다운로드 받아온 이미지를 확인한다.
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              470671670cac        8 weeks ago         237MB

* 윈도 10에서 받아온 이미지를 확인한다.
C:\Users\sangrok>docker images
REPOSITORY                    TAG       IMAGE ID       CREATED         SIZE
centos                        latest    5d0da3dc9764   8 months ago    231MB
ghdudwkd4/docker101tutorial   latest    8e5d9e04fe5f   9 months ago    28.2MB
docker101tutorial             latest    8e5d9e04fe5f   9 months ago    28.2MB
alpine/git                    latest    b8f176fa3f0d   12 months ago   25.1MB
jaspeen/oracle-xe-11g         latest    52fbd1fe2d7a   6 years ago     792MB

가. 도커에서는 하나의 이미지를 저장소(repository)라 함.
나. tag는 임의로 붙여진 추가적인 이름이다.(이미지의 version을 확인하기 위해 사용함)
    도커 명령어에서 이미지를 지정할 때 태그를 생략하면 latest가 사용된다.
다. image id는 이미지를 가리키는 고유한 해시 값
라. created는 이미지가 생성된 시간
마. size는 이미지의 용량을 나타냄.

5. 도커 허브(Docker Hub) - 공식 이미지 레지스트리
도커에서 제공하는 이미지 호스팅 서비스 도커 허브D

* docker info를 통해서 클라이언트에 지정된 기본 레지스트리의 주소를 확인할 수 있다.
$ docker info | grep Registry
 Registry: https://index.docker.io/v1

 index.docker.io는 도커 허브의 과거 도메인, 이미지와 관련된 정보는 도커 허브에서 확인함

* 도커사에서 기본 제공하는 이미지
https://index.docker.io/search?q=&type=image

* 도커사에서 공식적으로 제공하는 이미지와 사용자들이 직접 만들어서 올린 이미지로 나눠진다.
우분투, 센트OS, mySql, Redis, wordpress와 같은 공식 이미지를 제공한다.

6. 컨테이너(Container) 이해하기 - 격리된 환경에서 실행되는 프로세스

1) 도커 레지스트리에서 centos 이미지를 풀 받아서 로컬로 다운로드 받는다.
2) 이 이미지를 통해서 컨테이너를 실행한다.

이미지는 어떤 환경이 구성되어 있는 상태를 저장해 놓은 파일 집합.
이미지의 환경 위에서 특정한 프로세스를 격리시켜 실행한 것을 컨테이너라 부른다.

[요점] 이미지는 파일들의 집합이고, 컨테이너는 이 파일들의 집합 위에서 실행된 특별한 프로세스이다.

* 컨테이너는 docker run을 통해 실행한다.
-it 쉘을 실행하기 위해 붙임.
docker run -it <이미지이름:태그> <명령어>
$ docker run -it centos:latest bash
[root@d3fef9c0f9e9 /]#

=>호스트OS와 격리된 환경에서 bash 프로그램을 실행했다고 이해하는 것이 더 정확하다.

실행중인 컨테이너 목록을 확인 하는 명령
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
d3fef9c0f9e9        centos:latest       "bash"              3 minutes ago       Up 3 minutes                            sweet_keldysh

1) centos:latest이미지로 컨테이너를 생성
2) 이 격리된 환경에서 /bin/bash라는 명령어로 컨테이너를 실행함.
3) 도커를 실행하기 위해서 container id와 names를 사용함.
4) container id로 컨테이너를 조작할 수 있다.

[root@localhost.localdomain /]# docker ps
CONTAINER ID   IMAGE                         COMMAND                  CREATED         STATUS        PORTS                                                                NAMES
274194ed058c   romeoz/docker-nginx-php:7.0   "/usr/bin/supervisord"   13 months ago   Up 7 months   443/tcp, 9000/tcp, 0.0.0.0:55000->80/tcp                             test5_php_1
bbceaf0f6c49   romeoz/docker-nginx-php:5.6   "/usr/bin/supervisord"   13 months ago   Up 7 months   443/tcp, 9000/tcp, 0.0.0.0:11211->11211/tcp, 0.0.0.0:50000->80/tcp   crezone_php_1
5752d6e2f0ae   mysql:5.6                     "docker-entrypoint.s…"   13 months ago   Up 7 months   3306/tcp                                                             crezone_db_1
88608838407f   adminer                       "entrypoint.sh docke…"   13 months ago   Up 7 months   0.0.0.0:50001->8080/tcp                                              crezone_adminer_1

13개월 전에 컨테이너가 실행되고 있다는 것을 확인함.
 
* 죽은 컨테이너 목록까지 확인
$ docker ps -a

* 종료된 컨테이너 재시작 하기
$ docker restart d3fef9c0f9e9
d3fef9c0f9e9
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
d3fef9c0f9e9        centos:latest       "bash"              14 minutes ago      Up 8 seconds                            compassionate_turing
$

* 쉘과 입출력을 주고 받으려면, attach 명령어를 이용한다.
$ docker attach d3fef9c0f9e9
[root@d3fef9c0f9e9 /]#

* 실행된 컨테이너 강제 종료 : stop
* 종료된 컨테이너를 삭제 : rm , --rm 플래그는 컨테이너가 종료 상태가 되면 컨테이너를 자동 삭제한다.
* 가상머신은 컴퓨터라면, 컨테이너는 격리된 프로세스이다.
* 컨테이너는 가상머신이라기 보다는 프로세스이다.

7. 도커와 버전 관리 시스템

1) 도커에서 이미지는 불변(immutable)한 저장 매체이다.
2) 이 이미지 위에 무언가를 더해서 새로운 이미지를 만들어내는 일이 가능하다.
3) 저장소(repository), 풀(pull), 푸시(push), 커밋(commit), 차분(diff) 사용가능함.

* 도커에서 새로운 이미지를 생성하는 과정
$ docker pull ubuntu:bionic
...
$ docker run -it ubuntu:bionic bash
root@65d60d3dd306:/#

이 컨테이너에 Git을 설치한다.
root@65d60d3dd306:/# git --version
bash: git: command not found

어떤 컨테이너와 이 컨테이너의 부모 이미지 간의 파일 변경사항을 확인할 수 있는 명령어를 제공
git diff명령어로 프로젝트의 변경사항을 확인하듯, docker diff명령어로 부모 이미지와 여기서 파생된 컨테이너의 파일 시스템간의 변경사항을 확인.

$ dockre ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
65d60d3dd306        ubuntu:bionic       "bash"              About a minute ago   Up About a minute                       distracted_ardinghelli

$ dokcker diff 65d60d3dd306

아무것도 출력되지 않는다.

* 공식 우분투 이미지는 사용자가 루트로 설정되어 있음
sudo 명령 없이 apt를 직접 사용해 패키지를 설치할 수 있다.
root@65d60d3dd306:/# apt update
...
root@65d60d3dd306:/# apt install -y git
...
root@65d60d3dd306:/# git --version
git version 2.17.1

$ docker diff 65d60d3dd306 | head
C /usr
C /usr/lib
A /usr/lib/ssl
A /usr/lib/ssl/certs
A /usr/lib/ssl/misc
A /usr/lib/ssl/misc/CA.pl
A /usr/lib/ssl/misc/tsget
A /usr/lib/ssl/misc/tsget.pl
A /usr/lib/ssl/openssl.cnf
A /usr/lib/ssl/private

결과가 많으므로 head 앞쪽 부분만 출력 함.
[의미]
A : ADD
C : CHANGE
D : DELETE

$ docker run -it --rm ubuntu:bionic bash
root@33f6039322df:/# git --version
bash: git: command not found
root@33f6039322df:/# exit

* 우분투 이미지에 GIT을 설치함.
$ docker commit 65d60d3dd306 ubuntu:git
sha256:12924460218feb38da74e9a64c95acd55d16297346b2698f47f396936636c93d
$ REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              git                 12924460218f        4 seconds ago       186MB
ubuntu              bionic              4e5021d210f6        8 hours ago         64.2MB
centos              latest              470671670cac        2 months ago        237MB

$ docker run -i -t ubuntu:git bash
root@2a00b9b2b7cc:/# git --version
git version 2.17.1
root@2a00b9b2b7cc:/# exit

* docker rm은 컨테이너를 삭제하는 명령
* docker rmi는 이미지를 삭제하는 명령
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                        PORTS               NAMES
2a00b9b2b7cc        ubuntu:git          "bash"              2 minutes ago       Exited (130) 3 seconds ago                        cranky_franklin
$ docker rm 2a00b9b2b7cc
2a00b9b2b7cc
$ docker rmi ubuntu:git
Untagged: ubuntu:git
Deleted: sha256:487a3619305e68483059caa21eb54d1d812ced4282df9e2ba05ec46ed9a2b8f4
Deleted: sha256:9b6621e819f094c16ea9f63af90f7cb564a48133c05504fad0f28563865f957d

728x90

+ Recent posts