가상머신 : 하드웨어 가상화
컨테이너 : 프로세스의 실행환경을 격리
컨테이너는 사용자에게는 가상머신처럼 보이지만 실제로는 기반 시스템의 프로세스로 동작함
도커: 운영체제의 기능을 이용해 컨테이너를 실행하기 위한 파일 등 별도의 환경을 생성하고 리눅스 네임스페이스와 다양한 커널 기능을 조합해 해당 프로세스를 격리 실행 할 수 있는 도구
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.3 LTS"
$ 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 /]#
$ curl -s https://get.docker.com | sudo sh
$ docker -v
Docker version 19.03.8, build afacb8b7f0
$ 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 명령이 제대로 안된다
docker ps 명령을 해도 권한 오류가 난다
다음과 같이 docker 그룹을 설정한다
$ sudo groupadd docker // /etc/group에 docker 그룹 없을 시
$ sudo usermod -aG docker $USER
이후에 newgrp docker 또는
$ sudo su - $USER
$ docker ps
도커엔진 = 서버
도커 클라이언트 = 사용자의 docker 명령어
$ 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 images
REPOSITORY TAG IMAGE ID CREATED SIZE
아무런 결과 없음
docker 이용한 centos 생성
$ docker pull centos
--> 별도 지정하지 않으면 latest 버전 설치
도커는 이미지를 서버에서 먼저 찾아보고 없으면 도커 공식 저장소에서 찾는다
공식 저장소에서 다운서버에 있으면 풀 시킨다
확인
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 470671670cac 8 weeks ago 237MB
도커 공식 이미지 레지스트리
$ docker info | grep Registry
Registry: https://index.docker.io/v1/
$ docker run -it centos:latest bash
[root@d3fef9c0f9e9 /]#
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d3fef9c0f9e9 centos:latest "bash" 3 minutes ago Up 3 minutes sweet_keldysh
--> 도커 프로세스 실행 상태 확인 가능함
컨테이너 ID는 중요한 정보 임. 이를 통해 컨테이너 조작 함
$ 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
예를 들어 docker로 shell을 실행 시켰는데 그걸 exit 시켰다가 다시 들어갈 때
root@65d60d3dd306:/# exit // docker shell exit
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d3fef9c0f9e9 centos:latest "bash" 13 minutes ago Exited (0) 34 seconds ago compassionate_turing
종료 된 것 확인
$ 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
$
$ docker attach d3fef9c0f9e9
[root@d3fef9c0f9e9 /]#
$ 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
최초 설치 이미지와의 차이
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
설치 한 다음에 커밋 해줌
$ 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 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
Docker 실행 확인하기
방법1. docker ps
방법2. sudo systemctl status
1) docker 실행 instance를 찾는다.
예) $ systemctl status | grep next
2) docker inspect를 통해 조사한다.
Docker 내용 확인하기
$ docker inspect 9addb09317d312522961b69bbf7933e5fb50814cbf29be6b97a62be2858464f
$ docker exec -it 9addb09317d312522961b69bbf7933e5fb50814cbf29be6b97a62be2858464f /bin/sh
Docker 파일 복사
// docker 안의 파일 복사하기
$ docker cp <path_on_host> <container_id_or_name>:<path_inside_container>
// docker 로 파일 복사하기
$ docker cp /home/user/my_project/new_config.ini my_container:/etc/app/
복사 시 주의 사항
// docker 자체 정보
$ docker info // information displayed