도커(Docker)
컨테이너 기반의 오픈소스 가상화 플랫폼
컨테이너
호스트 OS 상에 논리적인 구획을 만들고, 애플리케이션을 작동시키기 위해 필요한 라이브러리나 애플리케이션 등을 하나로 모아 마치 별도의 서버인 것처럼 사용할 수 있게 만든 것
호스트 OS의 리소스를 논리적으로 분리시키고, 여러 개의 컨테이너가 공유하여 사용하며 컨테이너는 오버헤드가 적기 때문에 가볍고 고속으로 작동한다.
컨테이너는 AWS의 EC2인스턴스, VM등과 비슷하다.
도커의 기능
- 도커 이미지 만드는 기능: docker image build
- 도커 이미지를 공유하는 기능: docker image push/pull
- 도커 컨테이너를 작동시키는 기능: docker container run
도커의 기본 개념
도커는 컨테이너형 가상화 기술(운영체제 수준 가상화)을 사용
가상화 기술과 컨테이너 기술 비교
장점 | 가상 서버마다 OS를 선택할 수 있다 | 하나의 호스트OS에서 여러개의 OS를 동시에 이용할 수 있다 |
가상 서버들이 완전히 분리되어 있다 | 다른 컨테이너로의 복제성과 이식성이 뛰어나다 | |
단점 | 가상 서버마다 OS가 필요하므로 하드웨어 리소스의 소비량이 많다 | 운영체제의 커널을 공유하므로, 각 운영체제의 이미지는 각 운영체제에서만 실행 가능하다 |
가상 서버의 부팅에 시간이 걸린다 | 하나의 호스트 OS를 공유하기 때문에 컨테이너 하나가 사이버 공격을 받으면 다른 컨테이너가 위험에 노출될 가능성이 있다 |
실습
VM을 열어서 로그인 후, 내 IP확인
IP확인 후, MobaXterm으로 접속
도커 설치
[root@localhost ~]# yum install -y docker // CentOS 8 버전은 dnf 명령어로 설치
[root@localhost ~]# docker version
Client:
Version: 1.13.1
API version: 1.26
Package version:
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
// 도커는 시스템이므로 start 및 enable과정을 해주어야 한다.
[root@localhost ~]# systemctl start docker
[root@localhost ~]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@localhost ~]# docker version
이제 버전들을 확인할 수 있다.
도커는 go언어 사용
[root@localhost ~]# yum install -y bash-completion // 현재 최소버전이므로 자동완성 기능 설치
도커 이미지 검색 및 다운로드
[root@localhost ~]# docker system info // 도커 정보
[root@localhost ~]# docker search nginx
[root@localhost ~]# docker image pull nginx // nginx 이미지 다운(허브에 올라와있는 이미지 가져오기)
[root@localhost ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/nginx latest 298ec0e28760 6 days ago 133 MB
// repository는 도커 이미지의 이름이면서 레포지토리의 이름이기도 하다
// tag는 버전을 의미
// image ID는 UUID
[root@localhost ~]# docker image inspect docker.io/nginx:latest
[root@localhost ~]# cd /var/lib/docker/overlay2/
[root@localhost overlay2]# ls
3c8d9e92efb97ff914c717edf13e9be64dec38884a9c0d275dec629b7f7c6a84 78e03a2c41ffc2466a2b63dfd11caa5e3a7640b1c29013b8f1f9a025a6e989c2 b15e9d108e33d7d18a3347a9dce68473d07d12d270dd939245a33d57907898b7 backingFsBlockDev e3467ce2f2f3efa5cbcbebdc01bc916e47f91713e2362cda965d4143d89e6c62 ea488fd596a1779e816c7a04855236a585465fc53d581723f437c0eba3c3df0c
[root@localhost overlay2]# cd ea488fd596a1779e816c7a04855236a585465fc53d581723f437c0eba3c3df0c
// 위 이미지에 빨간박스 친 부분 복사
[root@localhost ea488fd596a1779e816c7a04855236a585465fc53d581723f437c0eba3c3df0c]# ls
diff link lower merged work
[root@localhost ea488fd596a1779e816c7a04855236a585465fc53d581723f437c0eba3c3df0c]# cd ~
[root@localhost ~]# pwd
/root
도커 컨테이너 실행 및 상태 확인
[root@localhost ~]# ss -ant // 현재 열려있는 포트를 확인할 수 있다
[root@localhost ~]# yum install -y httpd // 포트 충돌 시켜보기 위해 아파치 설치
[root@localhost ~]# sytemctl start httpd
[root@localhost ~]# systemctl status firewalld // 방화벽이 켜져있으므로 외부에서 접속 불가
[root@localhost ~]# firewall-cmd --permanent --add-port=80/tcp
success
[root@localhost ~]# firewall-cmd --reload
success
// 이제 아이피 치고 들어가면 접속이 된다
[root@localhost ~]# ss -ant
[root@localhost ~]# docker container run --name nginx -p 80:80 nginx // 맨 뒤 nginx는 이미지의 이름
/usr/bin/docker-current: Error response from daemon: driver failed programming external connectivity on endpoint nginx (c65d379fa4d765a92b4ffb5cefb85246e33e25ab5542f7cc25486c98d64d9931): Error starting userland proxy: listen tcp 0.0.0.0:80: bind: address already in use.
-> 아파치를 설치해 80포트를 사용하고 있기 때문에 충돌했다는 에러가 발생한다.
[root@localhost ~]# docker container ls -a (docker ps -a와 같은 명령어)
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c5ddf1653575 nginx "/docker-entrypoin..." 2 minutes ago Created nginx
[root@localhost ~]# docker rm nginx // 도커 삭제
nginx
[root@localhost ~]# docker container run --name nginx -p 8080:80 nginx // 현재 사용하지 않고 있는 8080포트로 다시 실행
// 8080포트의 아이피를 치고 들어가면 접속된다.
// ctrl+c를 누르면 컨테이너가 꺼지면서 웹이 종료된다.
[root@localhost ~]# docker container run --name nginx -d -p 8080:80 nginx
// 백그라운드로 실행시켜야 명령어 입력후 다음 프롬포트가 생긴다. (d 옵션이 백그라운드 실행)
// nginx의 이미지를 갖고 또다른 컨테이너 실행
[root@localhost ~]# docker container run --name nginx1 -d -p 8181:80 nginx 91a0551776a5004c0b97f4716115691202cf299b825ec701afbf209821365a67
-> docker0가 포트를 제어해주고있다
[root@localhost ~]# yum install -y net-tools // ifconfig, netstat -tnlp등의 명령어 사용가능하도록
[root@localhost ~]# docker container stats nginx // 현재 컨테이너 사용현황 확인 (CPU, 메모리등)
[root@localhost ~]# docker container stop nginx // 도커 컨테이너 멈춤
nginx
[root@localhost ~]# docker start nginx // 도커 컨테이너 실행
nginx
[root@localhost ~]# docker rm -f nginx // 도커 컨테이너 삭제 (f 옵션으로 강제로 삭제)
nginx