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
'프로그래밍 > 리눅스' 카테고리의 다른 글
리눅스 파일 있으면 복사 없으면 생성하기 (0) | 2022.08.18 |
---|---|
리눅스 특정 폴더 용량 확인하기 (0) | 2022.07.27 |
리눅스 파일명으로 검색 (0) | 2020.03.12 |
특정 IP만 ssh 접속 허용하기 (0) | 2019.05.21 |
GREP 활용 (0) | 2019.04.24 |