1. 도커란?
도커는 리눅스 컨테이너에 여러 기능을 추가함으로써 애플리케이션을 컨테이너로서 좀 더 쉽게 사용할 수 있게 만들어진 오픈소스 프로젝트이다.
1.1 차이점
가상머신은 각종 시스템 자원을 가상화하고 독립된 공간을 생성하는 작업은 하이퍼바이저를 반드시 거치기 때문에 일반 호스트에 비해 성능의 손실이 무조건 발생한다. 그리고 운영체제를 사용하기 위해 라이브러리, 커널등을 전부 포함하기 때문에 이미지의 크기가 크다.
그에 비해 도커 컨테이너는 가상화된 공간을 생성하기 위해 리눅스의 자체 기능인 chroot, namespace, cgroup을 사용함으로써 프로세스 단위의 격리 환경을 만들기 때문에 성능 손실이 거의 없다.
컨테이너에 필요한 커널은 호스트 OS의 커널을 공유해 사용하고 필요한 라이브러리 및 실행 파일만 존재하기 때문에 이미지의 크기가 작은것이다.
1.2 도커의 장점
도커 컨테이너는 호스트 OS위에서 실행되는 격리된 공간이다. 따라서 컨테이너 자체에 특별한 권한을 주지 않는 한, 컨테이너 내부에서 여러 SW를 설치하고 config파일을 수정해도 호스트 OS에는 영향을 주지 않는다.즉, 독립된 개발 환경을 보장받을 수 있다는 것이다.
서비스를 개발했을 때 사용했던 환경을 다른 서버에서도 컨테이너로서 똑같이 복제할 수 있기 때문에 개발/운영 환경의 통합이 가능하다/
또한 도커는 이미지 내용을 레이어 단위로 구성하며, 중복되는 레이어를 재사용할 수 있어서 애플리케이션의 배포속도가 매우 빨라진다는 장점이 있다.
2. Centos7에 Docker 설치
도커를 리눅스에 설치할 때 커널의 버전은 3.10 버전 이상을 사용해야 정상적으로 사용이 가능하다.
추가로 64bit인지 확인 한다.
[root@localhost ~]# uname -r
3.10.0-1160.el7.x86_64
아래와 같이 명령어를 입력해여 Docker를 설치한다.
[root@localhost ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[root@localhost ~]# yum -y install docker-ce
[root@localhost ~]# systemctl start docker
설치 후 docker info를 입력하면 아래와 같이 정보가 출력되고 -v옵션과 version을 통해 버전 정보도 확인 할 수 있다.
[root@localhost ~]# docker info | head -15
Client:
Context: default
Debug Mode: false
Plugins:
app: Docker App (Docker Inc., v0.9.1-beta3)
buildx: Build with BuildKit (Docker Inc., v0.5.1-docker)
scan: Docker Scan (Docker Inc., v0.8.0)
Server:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 20.10.7
[root@localhost ~]# docker version
Client: Docker Engine - Community
Version: 20.10.7
API version: 1.41
Go version: go1.13.15
Git commit: f0df350
Built: Wed Jun 2 11:58:10 2021
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.7
API version: 1.41 (minimum version 1.12)
Go version: go1.13.15
Git commit: b0f5bc3
Built: Wed Jun 2 11:56:35 2021
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.4.6
GitCommit: d71fcd7d8303cbf684402823e425e9dd2e99285d
runc:
Version: 1.0.0-rc95
GitCommit: b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7
docker-init:
Version: 0.19.0
GitCommit: de40ad0
[root@localhost ~]# docker -v
Docker version 20.10.7, build f0df35
3. 도커 컨테이너 다루기
도커 이미지를 간단하게 설명하면
lion/centos:7 이런 이미지가 있다는고 한다면 lion은 저장소 이름이고 centos는 이미지 이름 7은 이미지 버전이다.
아래 명령어를 이용해 첫 번째 컨테이너를 생성한다. run명령어는 컨테이너를 생성하고 실행 시켜주는 역할을 한다.
-i 옵션과 -t 옵션은 같이 쓰이는 경우가 매우 많다 이 두 옵션은 컨테이너를 종료하지 않은체로, 터미널의 입력을 계속해서 컨테이너로 전달하기 위해서 사용한다. 따라서, -it 옵션은 특히 컨테이너의 쉘(shell)이나 CLI 도구를 사용할 때 매우 유용하게 사용된다.
[root@localhost ~]# docker run -it ubuntu:14.04
ubuntu:14.04이미지가 로컬에 없으면 도커 중앙 이미지 저장소인 도커 허브에서 자동으로 이미지를 내려받는다.
Unable to find image 'ubuntu:14.04' locally
14.04: Pulling from library/ubuntu
2e6e20c8e2e6: Pull complete
0551a797c01d: Pull complete
512123a864da: Pull complete
Digest: sha256:5c01e896fa6eeaa41f3509c64af668d71d06e318cfe373dabab9d61b9eaf6441
Status: Downloaded newer image for ubuntu:14.04
다운이 완료되면 아래와 같이 생성 및 실행과 동시에 컨테이너 내부로 들어와진다.
기본 사용자는 root이고 호스트 이름은 무작위 16진수 해시값으로 설정된다.
ls 명령어로 파일 시스템을 확인해보면 아무것도 설치되어 있지 않은 상태이다.
root@abc2bd22d0f6:/# ls; uname -r
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
3.10.0-1160.el7.x86_64
제일 중요한것은 컨테이너에서 나가는법인데 이것은 두가지로 나뉘어진다.
첫 번째 컨테이너를 중지하면서 나가는법은 exit를 입력하거나 Ctrl + D를 입력하면 컨테이너가 정지가 되면서 내부에서 빠져나오게 된다.
ps옵션에 대해선 뒤에서 자세히 설명하겠다. 중요한건 STATUS를 보면 현재 중지 된것을 확인 할 수 있다.
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
abc2bd22d0f6 ubuntu:14.04 "/bin/bash" 6 minutes ago Exited (0) 18 seconds ago hungry_goldwasser
이번엔 컨테이너가 중지 되지 않고 내부에서 빠져나오려면 Ctrl + P +Q를 누르면 된다.
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
abc2bd22d0f6 ubuntu:14.04 "/bin/bash" 9 minutes ago Up About a minute hungry_goldwasser
컨테이너를 생성하지 않고 이미지만 내려받으려면 아래와 같이 pull을 사용한다.
그리고 images 옵션을 사용하면 현재 다운받은 이미지의 목록을 확인 할 수 있다.
[root@localhost ~]# docker pull centos:7
7: Pulling from library/centos
2d473b07cdd5: Pull complete
Digest: sha256:0f4ec88e21daf75124b8a9e5ca03c37a5e937e0e108a255d890492430789b60e
Status: Downloaded newer image for centos:7
docker.io/library/centos:7
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 14.04 13b66b487594 2 months ago 197MB
centos 7 8652b9f0cb4c 7 months ago 204MB
run명령어가 아닌 create명령어로도 컨테이너 생성이 가능하다.
[root@localhost ~]# docker create -it --name mycentos7 centos:7
af31043f32af569c5b03d102ce8aa811d110f23fd2020864b1aabd45f3f2ca13
create와 run의 차이점은 create는 컨테이너를 생성만 해줍니다.
따로 아래와 같이 start와 attach를 사용하여 내부로 들어가줍니다.
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
af31043f32af centos:7 "/bin/bash" 14 seconds ago Created mycentos7
abc2bd22d0f6 ubuntu:14.04 "/bin/bash" 26 minutes ago Up 18 minutes hungry_goldwasser
[root@localhost ~]# docker start mycentos7
mycentos7
[root@localhost ~]# docker attach mycentos7
[root@af31043f32af /]#
추가적으로 컨테이너를 대상으로 하는 명령어는 컨테이너의 이름 대신 ID를 쓸 수 있다. 그러나 ID의 이름이 너무 길 때는 앞의 2~3자만 입력해도 된다.
[root@localhost ~]# docker start af31043
af31043
[root@localhost ~]# docker attach af3
[root@af31043f32af /]#
아래는 각종 명령어들이다.
# 실행중인 컨테이너 목록
[root@localhost ~]# docker ps
# 전체 컨테이너 목록
[root@localhost ~]# docker ps -a
#컨테이너 고유 ID값
[root@localhost ~]# docker inspect mycentos7 | grep Id
"Id": "af31043f32af569c5b03d102ce8aa811d110f23fd2020864b1aabd45f3f2ca13",
# 컨테이너 이름 변경
[root@localhost ~]# docker rename $Container_before $Container_after
# 컨테이너 목록 값 변경
[root@localhost ~]# docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Status}}"
CONTAINER ID IMAGE STATUS
abc2bd22d0f6 ubuntu:14.04 Up 47 minutes
# 정지된 컨테이너 삭제
[root@localhost ~]# docker rm $Container_name
# 실행중인 컨테이너 삭제 1
[root@localhost ~]# docker stop $Container_name
[root@localhost ~]# docker rm $Container_name
# 실행중인 컨테이너 삭제 2
[root@localhost ~]# docker rm -f $Container_name
# 전체 컨테이너 삭제 1
[root@localhost ~]# docker container prune
# 전체 컨테이너 삭제 2
[root@localhost ~]# docker rm -f $(docker ps -a -q)
'Cloud > Doker' 카테고리의 다른 글
[docker] docker 볼륨 사용법 3가지 (0) | 2021.07.12 |
---|---|
[docker] docker -it 와 -d 옵션의 차이점 (0) | 2021.06.23 |
[docker] docker 어플리케이션 구동 (0) | 2021.06.22 |