컨테이너는 격리된 공간에서 프로세스가 동작하는 기술이다.
- 도커 컨테이너는 도커 이미지 기반으로 만들어지는 스냅숏이다.
- 도커 이미지 레이어 위에 읽고 쓰기가 가능한 컨테이너 레이어를 결합한 것이다.
docker run~
명령어를 통해 컨테이너가 동작하고, 가상의 격리 환경에 독립된 프로세스가 동작한다.- 서버 호스트 OS가 독립적으로 동작하는 것과 유사
- 독립된 호스트 OS는 init 프로세스와 같은 최상위 부모 프로세스가 필요하다.
- 도커 컨테이너 실행 시 PID 네임스페이스 커널 기능을 통해 1번 프로세스(init)의 PID를 공유하고 그 하위로 프로세스를 격리한다.
- 이렇게 격리된 프로세스를 루트로 변경하는 chroot 커널 기능을 통해 독립된 1번 PID를 갖게 된다.
- 컨테이너 동작 시 필요한 자원 할당은 cgroups 커널 기능을 통해 이루어진다.
docker run
명령을 사용하면 해당 도커 이미지 복사본 스냅숏 레이어 위에 읽고 쓰기가 가능한 컨테이너 레이어를 추가한다.docker start
명령으로 컨테이너를 시작할 수 있다.docker ps
명령어로 컨테이너를 조회할 수 있다.
docker run
은 상당히 많은 옵션을 가지고 있다.
# create는 run과 달리 컨테이너 내부 접근을 하지 않고 생성(스냅숏)만 수행
$ docker create -it --name container-test1 ubuntu:14.04
# status를 보면 start가 아닌 'created'이다.
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d663638164f5 ubuntu:14.04 "/bin/bash" 12 seconds ago Created container-test1
# 생성된 스냅숏을 동작시킨다.
$ docker start container-test1
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d663638164f5 ubuntu:14.04 "/bin/bash" About a minute ago Up 2 seconds container-test1
# 컨테이너에 접속 (attach 명령은 실행 중인 애플리케이션 컨테이너에 단순 조회 작업 수행 시 유용)
$ docker attach container-test1
root@a6dde9767c3d:/# exit
# 컨테이너 강제 종료 삭제
$ docker rm container-test1
run
명령어로 수행 $ docker run -it --name container-test1 ubuntu:14.04 bash
root@a6dde9767c3d:/# exit
$ docker rm container-test1
$ docker pull mysql
# 컨테이너 생성, 접속
$ docker run -it --name test-mysql mysql /bin/bash
bash-4.4# exit
# exit 명령으로 나오면 컨테이너가 종료된다.
# 컨테이너 다시 접속
$ docker start test-mysql
$ docker exec -it test-mysql /bin/bash
bash-4.4#
bash-4.4# mysql -u root -p
...
mysql> exit
bash-4.4# exit
# 컨테이너 종료 및 삭제
$ docker stop test-mysql
$ docker rm test-mysql
$ docker pull nginx:1.18
$ docker run --name nginx-server -d -p 8001:80 nginx:1.18
3b56bd090be772e7d373200a1cc140706b7a6fe986005de5482299289ffce672
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3b56bd090be7 nginx:1.18 "/docker-entrypoint.…" 4 seconds ago Up 3 seconds 0.0.0.0:8001->80/tcp nginx-server
# 연결 확인
$ curl localhost:8001
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...
# 실시간 로그 확인
$ docker logs -f nginx-server
localhost:8001
로 접속하면 nginx 웹서버 화면을 확인할 수 있다.docker run
의 옵션
-d
: 컨테이너를 백그라운드로 실행하고 컨테이너 ID를 반환-p 8001:80
: 컨테이너의 80번 포트를 호스트 포트 8001로 오픈