Docker, Kubernetes

Docker - Container 생성과 관리

728x90

(이 포스팅은 유데미의 Docker Mastery: with Kubernetes +Swarm from a Docker Captain

(www.udemy.com/course/docker-mastery/) 를 수강하면서 공부한것들을 요약한 글이다.)

 

 

- 사용한 환경 및 버젼

Host OS : Windows 10 Edu

cmder : 1.3.16.1035

docker : Community Edition 20.10.0

 

 

 

1. Ngnix Web Server 컨테이너 생성해보기.

: 도커의 가장 기본이 되는 단위는 컨테이너 이다.

 

비유를 들자면, 컨테이너는 이미지의 인스턴스이고,

이미지는 클래스라 볼 수 있다.

그래서, 이미지 하나만 가지고 수많은 컨테이너를 생성할 수 있으며,

이미지에 변화를 줘서 버전이 바뀐다면, 다른 버전의 컨테이너를 생성할 수도 있다.

 

 

Docker Hub 에 가보면 여러가지 이미지를 볼 수 있는데

hub.docker.com/

 

Docker Hub

Build and Ship any Application Anywhere Docker Hub is the world's easiest way to create, manage, and deliver your teams' container applications.

hub.docker.com

 

웹 서버 관련 이미지 (Nginx, Apache Tomcat 등), 리눅스 관련 이미지 (CentOS, Ubuntu, Alpine 등), 데이터 베이스 이미지 (MySQL, PostgreSQL 등) 등을 제공하는 것을 볼 수 있다.

 

기본적으로 컨테이너를 생성하기 위해서는 이미지를 registry 로 부터 받아와야 하고,

공식 이미지 같은 경우 대부분 Docker Hub 에 있다. 

 

Docker Hub 로 부터 Nginx 공식 이미지를 받아와서 웹서버 컨테이너를 하나 가동해보자.

 

명령 프롬프트 창에 명령어를 다음과 같이 입력한다 (여기서 나는 cmder 를 사용했다)

docker container run --publish 80:80 nginx
cs

 

이 명령을 실행하면 아래 그림처럼 

커맨드 창이 계속 웹 서버의 로그 기록을 보고 있는 상태로 남아 있게 된다.

 

이 명령을 수행했을때, 내부적으로 다음과 같은 일들이 발생한다

 

1. Docker Engine 이 Host 에 nginx 라는 이미지가 있는지 확인한다.

2. 없다면, Docker Hub 로 가서 nginx 이미지를 찾는다.

(명령어에 이미지 이름을 입력할때 nginx:1.18.0 이런식으로 버전을 직접 지정해주지 않으면, Docker Engine 은 기본적으로 Docker Hub 에서 latest 버전을 찾아서 받아온다)

3. 이 이미지를 기반으로하는 컨테이너를 하나 생성한다. 

4. --publish 80:80 옵션에 의해서 Host 의 포트 번호 80번, nginx 컨테이너 포트 번호 80번이 서로 연결된다.

5. 이 포트 번호와 IP 주소에 맞는 트래픽이 오게되면, 이를 라우팅 해준다.

 

 

Host 의 80번 포트를 개방해 컨테이너와 열었으므로, 실제로 브라우저 상에서 localhost:80 를 쳐서 들어가면

다음과 같은 Nginx 기본 창이 뜨는 것을 볼 수 있다.

 

 

지금의 명령어는 커맨드 창에서 계속해서 웹 서버의 로그기록을 주시하도록 설정되어 있는데,

이를 피하고 싶으면 --detach (약칭 -d) 옵션을 추가해줘야 한다.

 

또한 지금 run 명령어는 생성된 컨테이너에 이름값을 따로 부여하지도 않아서 랜덤으로 이름이 생성되었다.

 

이름을 별도로 부여하고 싶으면 --name "주려는이름" 으로 부여해야한다.

 

 

다음과 같이 명령어를 쓴다면..

docker container run --detach --publish 80:80 --name test-web-server nginx
cs

 

컨테이너를 생성하고, 실행하되, 커맨드 창에 계속해서 로그를 보여주는 foreground 상태가 아니라

background 로 남은 상태로 있을 것이며 (--detach)

웹서버의 포트 번호 매칭을 호스트 포트 80, 컨테이너 포트 80 으로 맞추고 (--publish 80:80)

컨테이너의 이름을 test-web-server 라 지어라 (--name test-web-server)

그리고 이미지 이름은 nginx 이다. (latest version)

 

가 된다.

 

이 방식으로 실행하면 --detach 에 의해 더 이상 커맨드 명령창에 로그가 보이지 않게 된다. 

(종료 된것은 아니고, host 안에서 컨테이너는 계속 실행 중인 상태임)

 

 

 

컨테이너들은 각각 고유의 id 값을 갖고 있다.

컨테이너에 대한 정보를 얻고자 한다면 다음과 같이 명령어를 쳐보면 알 수 있다.

docker container ls
cs

 

- 결과

 

컨테이너의 고유의 ID 값, 이미지 이름, 명령어, 생성일, 상태, 포트번호, 이름 의 정보를 알 수 있다.

 

이 고유의 ID 값을 가지고 컨테이너를 종료 시킬 수 있는데

다음과 같이 적어주면 된다,

docker container stop <container-id>
cs

 

컨테이너의 id 값을 적을때 굳이 다 입력할 필요는 없고, 해당 컨테이너임을 구분할 수 있는 id 일부 값만 입력해도 docker engine 이 찾아내서 종료시킨다.

id 대신 컨테이너의 이름을 써도 된다.

 

추가적으로 background 상태로 남긴 웹 서버의 로그 기록을 커맨드 창에서 보고 싶으면

docker container logs <container-id>
cs

 

를 쓰면, 

위와 같이 로그 기록을 볼 수 있다.

 

이것외에도, 특정한 컨테이너 내부에서 실행되고 있는 프로세스 정보를 보고 싶으면

아래의 명령어를 치면된다,

docker container top <container-id>
cs

 

- 결과

 

특정한 컨테이너를 제거하고 싶을때는, 

docker container rm <container-id>
cs

를 치면 된다.

 

 

* 참고) 도커의 하위 호환성

: 과거의 도커 명령어는 지금처럼 management commands 가 도입되지 않아서, 명령어를 약간 다르게 써야했다.

예를들어, 앞서서 본 컨테이너 정보 확인을 위한 커맨드를 docker container ls 라고 쳤었는데, 과거의 명령어는 docker ps 로 썼었다. 

그러나, 과거 버전의 명령어라고 지금 버전에서 사용이 불가능 한 것은 아니다. 

현 버전에서도 docker ps 라고 치면 똑같이 커맨드를 수행한다.

 

 

 

2. Start VS Run.

: 도커에서 컨테이너를 실행하는데는 두가지 명령어가 있다.

Start 와 Run 이다.

 

start 는 정지된 컨테이너를 다시 실행 시키는 명령어이다.

docker container start <container-id>
cs

그러나, run 은 앞서 본 것 처럼, 새롭게 컨테이너를 만들고 실행한다는게 차이점이다.

docker container run 을 실행했을때, 내부과정을 다시 더 자세하게 살펴보면

 

1. Docker Engine 이 image cache 에서 해당 이미지가 존재하는지 파악한다

2. 없으면 default remote image registry 로 설정된 Docker Hub 로 가서 받아온다.

3. 해당 이미지를 기반으로 새로운 컨테이너를 만들어낸다.

4. Docker Engine 내부에 가상 네트워크가 있고, 이 가상 네트워크에서 가상의 IP 주소값을 컨테이너에 부여한다.

5. --publish 옵션을 줬다면, 호스트의 포트와 컨테이너의 포트를 연결한다

6. Dockerfile 을 작성했다면 Dockerfile 에 명시된 커맨드를 수행한다.

 

이런 과정을 거쳐서 run 명령어가 수행된다

그래서 엄연히 docker container start 와 docker container run 은 다름을 주의해야한다.

 

 

 

3. 다수의 컨테이너 관리해보기

직접 3개의 컨테이너를 생성해서 관리를 해보자.

 

- httpd(Apache), Nginx, MySQL 세개의 컨테이너를 생성해보고, 각자 다른 포트 번호를 부여해주고, --detach 옵션을 줘서 background 상태로 남겨두고, MySQL 은 생성시에 root 의 비밀번호를 랜덤하게 줄 수 있도록 처리해준뒤, MySQL 서버 로그 기록을 통해서 비밀번호를 찾아내보자. 그리고 이를 확인했다면, 컨테이너를 정지시키고 삭제해주자.

 

 

 

먼저 다음과 같이 컨테이너 생성 & 실행 명령어인 run 을 사용해 준다.

 

1. nginx

docker container run --detach --publish 80:80 nginx
cs

 

2. httpd(Apache)

docker container run --detach --publish 8080:80 httpd
cs

 

3. MySQL

docker container run --detach --publish 3306:3306 --env MYSQL_RANDOM_ROOT_PASSWORD=yes mysql
cs

 

이렇게 생성하면 아래와 같이 3개의 컨테이너를 생성하게 된다.

 

그리고 컨테이너의 로그 기록을 보기 위해서

docker container logs "MySQL 컨테이너 이름 혹은 아이디"
cs

 

를 입력하면 다음과 같은 MySQL 컨테이너의 로그 기록을 볼 수 있고, 

비밀번호가 생성된 부분도 확인 할 수 있다. (빨간색 칠한 부분)

 

마지막으로 docker container stop, docker container rm 명령어를 통해 해당 컨테이너들을 정지시키고 지워준다.

 

 

 

지금까지 컨테이너의 생성과 정지, 삭제, 로그 기록 확인, 컨테이너 정보 등 

여러가지 기초적인 컨테이너 관련 명령어들을 살펴보았다.

다음 포스팅은 도커의 가상 네트워크에 관해서 알아보겠다.

 

 

 

 

- references)

1. Host port ? Container port ?

: blog.naver.com/alice_k106/220278762795

 

15. [Docker] 도커에서 Container 포트와 Host 포트의 개념

Docker를 처음 접하는 사람이라면 응당 리눅스를 사용할 것이고, 포트에 대한 개념도 알고 있을 것이다. ...

blog.naver.com

 

2. Getting a Shell in the Docker for Windows Moby VM

: www.bretfisher.com/getting-a-shell-in-the-docker-for-windows-vm/

 

Getting a Shell in the Docker for Windows Moby VM

When using Docker for Windows, you're actually using a tiny (custom) LinuxKit Linux running in a special Hyper-V VM. There's so much cool stuff happening, you're meant to forget it's still running on a Linux kernel. Note this is about the default "Linux Co

www.bretfisher.com

 

 

728x90

'Docker, Kubernetes' 카테고리의 다른 글

Docker - 기본 내용 요약  (0) 2020.09.06