-
도커 컨테이너(Docker Container)BackEnd/docker 2022. 3. 6. 11:07반응형
컨테이너 생성
run 명령어
run 명령어를 입력하면 도커 이미지가 로컬 도커 엔진에 존재하지 않으므로 도커 중앙 이미지 저장소인 도커 허브에서 자동으로 이미지를 내려받습니다. 단 한 줄의 docker 명령어로 컨테이너를 생성 및 실행과 동시에 컨테이너 내부로 들어왔습니다. 셸의 사용자와 호스트 이름이 변경된 것(root@c3a41b157876)이 컨테이너 내부에 들어와 있다는 것을 나타냅니다. 컨테이너에서 기본 사용자는 root이고 호스트 이름은 무작위의 16진수 해시값입니다.
$ docker run -i -t 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:60840958b25b5947b11d7a274274dc48ab32a2f5d18527f5dae2962b64269a3a Status: Downloaded newer image for ubuntu:14.04 root@c3a41b157876:/#
docker run: 컨테이너를 생성하고 실행하는 역할을 합니다.
- -i -t: 컨테이너와 상호 입출력을 가능하게 합니다. (-i: 상호 입출력, -t: tty를 활성화해서 배시(bash) 셸 사용)
- -d: -i -t가 컨테이너 내부로 진입하도록 attach 가능한 상태로 설정한다면 -d는 Detached 모드로 컨테이너를 실행합니다. Detached 모드는 컨테이너를 백그라운드에서 동작하는 애플리케이션으로써 실행하도록 설정합니다. 즉, -d 옵션으로 run을 실행하면 입출력이 없는 상태로 컨테이너를 실행합니다. Detached 모드인 컨테이너는 반드시 컨테이너에서 프로그램이 실행돼야 하며, 포그라운드 프로그램이 실행되지 않으면 컨테이너는 종료됩니다.
- -e: 컨테이너 내부의 환경변수를 설정합니다.
- --link: 내부 IP를 알 필요 없이 항상 컨테이너에 별명(alias)으로 접근하도록 설정합니다. 단, --link에 입력된 컨테이너가 실행 중이지 않거나 존재하지 않는다면 --link를 적용한 컨테이너 또한 실행할 수 없습니다. deprecated된 옵션으로 도커 브리지(bridge) 네트워크 사용을 권장합니다.
ubuntu:14.04: 컨테이너를 생성하기 위한 이미지의 이름입니다.
create 명령어
create 명령어는 컨테이너를 생성만 합니다. 그러므로 run 명령어와 달리 컨테이너 내부로 들어가지 않습니다. 즉, run 명령어는 pull, create, start 명령어를 일괄적으로 실행한 후 attach가 가능한 컨테이너라면 컨테이너 내부로 들어갑니다.
$ docker create -i -t --name myubuntu ubuntu:14.04 # 컨테이너 생성 $ docker start myubuntu # 컨테이너 시작 $ docker attach myubuntu # 컨테이너 내부로 들어가기 $ docker pull ubuntu:14.04 # 이미지 내려받기 $ docker images # 도커 엔진에 존재하는 이미지 목록 출력 $ docker inspect <option> <image or container> # 컨테이너 세부정보 확인
컨테이너에서 나오기
- exit 입력 or Ctrl + D: 컨테이너 내부에서 빠져나오면서 동시에 컨테이너를 정지시킵니다.
- Ctrl + P, Q: 단순 컨테이너의 셸에서만 빠져나옵니다. (애플리케이션 개발 시 사용)
컨테이너 목록 확인
$ docker ps # 정지되지 않은 컨테이너만 출력 $ docker ps -a # 모든 컨테이너 출력 (STATUS: Exited는 정지, Up는 실행 중, Pause는 일시 중지된 상태)
출력 결과 형태 지정
ps 명령어의 출력 결과가 알아보기 힘들 때 --format 옵션에 {{.ID}}\t{{.Status}}와 같은 Go 템플릿을 입력해서 원하는 정보만 출력할 수 있습니다.
$ docker ps -a --format "table {{.ID}}\t{{.Status}}" CONTAINER ID STATUS c3a41b157876 Exited (0) 2 hours ago
컨테이너 이름 변경
컨테이너 생성 시 --name 옵션으로 이름을 설정하지 않으면 도커 엔진이 임의로 형용사와 명사를 무작위로 조합해 이름을 설정합니다.
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c3a41b157876 ubuntu:14.04 "/bin/bash" 2 hours ago Exited (0) 2 hours ago reverent_poincare $ docker rename reverent_poincare myubuntu $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c3a41b157876 ubuntu:14.04 "/bin/bash" 2 hours ago Exited (0) 2 hours ago myubuntu
컨테이너 삭제
한 번 삭제한 컨테이너는 복구할 수 없으므로 삭제할 때 신중해야 합니다.
$ docker rm myubuntu # 컨테이너 삭제 myubuntu $ docker ps -a # 컨테이너 삭제 확인 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES # 실행 중인 컨테이너는 삭제할 수 없습니다. # 1) 컨테이너 정지 후 삭제합니다. $ docker stop myubuntu # 컨테이너 정지 $ docker rm myubuntu # 컨테이너 삭제 # 2) 실행 중인 컨테이너 force 삭제 $ docker rm -f myubuntu # 모든 컨테이너 삭제 $ docker container prune
컨테이너 외부 노출
컨테이너는 가상 머신과 마찬가지로 가상 IP 주소를 할당받습니다. 기본적으로 도커는 컨테이너에 172.17.0.x의 IP를 순차적으로 할당합니다. 컨테이너를 새롭게 생성한 후 ifconfig 명령어로 컨테이너의 네트워크 인터페이스를 확인합니다.
$ docker run -i -t --name network_test ubuntu:14.04 root@3db2a1829193:/# ifconfig eth0 Link encap:Ethernet HWaddr 02:42:ac:11:00:02 inet addr:172.17.0.2 Bcast:172.17.255.255 Mask:255.255.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:8 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:736 (736.0 B) TX bytes:0 (0.0 B) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
도커의 NAT IP인 172.17.0.2를 할당받은 eth0 인터페이스와 로컬 호스트인 lo 인터페이스가 있습니다. 외부에 컨테이너의 애플리케이션을 노출하기 위해서는 eth0의 IP와 포트를 호스트의 IP와 포트에 바인딩해야 합니다. 바인딩 시 -p 옵션을 사용합니다. -p 옵션은 컨테이너의 포트를 호스트의 포트와 바인딩해 연결할 수 있게 설정합니다.
-p 옵션의 입력 형식: [호스트의 포트]:[컨테이너의 포트]
여러 개의 포트를 외부에 개방하려면 -p 옵션을 여러 번 써서 설정합니다.
$ docker run -i -t -p 3306:3306 -p 192.168.0.100:7777:80 ubuntu:14.04
컨테이너를 생성하고 아파치 웹 서버를 설치해 외부에 노출하겠습니다. 아파치 웹 서버는 기본적으로 80번 포트를 사용하므로 여기서는 컨테이너의 80번 포트를 호스트와 연결합니다.
$ docker run -i -t --name mywebserver -p 80:80 ubuntu:14.04 root@8bb719d99d6c:/# apt-get update root@8bb719d99d6c:/# apt-get install apache2 -y root@8bb719d99d6c:/# service apache2 start
아파치 웹 서버의 설치 및 실행이 완료되면 [도커 엔진 호스트의 IP]:80으로 접근합니다.
컨테이너 애플리케이션 구축
서비스를 컨테이너화(Containerize) 할 때 여러 개의 애플리케이션을 한 컨테이너에 설치할 수도 있지만, 컨테이너에 애플리케이션을 하나만 동작시키면 컨테이너 간의 독립성을 보장함과 동시에 애플리케이션의 버전 관리, 소스코드 모듈화 등이 쉬워집니다. 예를 들어, 데이터베이스와 웹 서버 컨테이너를 구분하는 편이 도커 이미지를 관리하고 컴포넌트의 독립성을 유지하기가 쉽습니다. 한 컨테이너에 프로세스 하나만 실행하는 것이 도커의 철학입니다.
데이터베이스와 워드프레스 웹 서버 컨테이너를 연동해 워드프레스 기반 블로그 서비스를 만들어 보겠습니다.
$ docker run -d \ --name wordpressdb \ -e MYSQL_ROOT_PASSWORD=wordpress \ -e MYSQL_USER=wordpress \ -e MYSQL_PASSWORD=wordpress \ -e MYSQL_DATABASE=wordpress \ mysql:5.7
$ docker run -d \ -e WORDPRESS_DB_USER=wordpress \ -e WORDPRESS_DB_PASSWORD=wordpress \ --name wordpress \ --link wordpressdb:mysql \ -p 80 \ wordpress
첫 번째 명령어는 mysql 이미지를 사용해 데이터베이스 컨테이너를, 두 번째 명령어는 워드프레스 이미지를 이용해 워드프레스 웹 서버 컨테이너를 생성합니다. 워드프레스 웹 서버 컨테이너의 -p 옵션에서 80을 입력했으므로 호스트의 포트 중 하나와 컨테이너의 80번 포트가 연결됩니다.
wordpress 이름의 컨테이너가 사용 중인 호스트의 포트를 확인합니다. 출력 결과에서 0.0.0.0은 호스트의 활용 가능한 모든 네트워크 인터페이스에 바인딩함을 뜻합니다.
$ docker port wordpress 80/tcp -> 0.0.0.0:62849
웹 브라우저로 [호스트IP]:62849에 접근했을 때 다음과 같은 화면이 나타나면 워드프레스 컨테이너가 성공적으로 생성된 것입니다.
exec 명령어를 이용하면 컨테이너 내부의 셸을 사용할 수 있습니다. 다음 명령어를 입력하면 mysql 컨테이너 내부에 /bin/bash 프로세스를 실행하고, -i -t 옵션을 사용해 배시 셸을 쓸 수 있게 유지합니다.
$ docker exec -i -t wordpressdb /bin/bash root@b7932c489695:/# echo $MYSQL_ROOT_PASSWORD wordpress
반응형'BackEnd > docker' 카테고리의 다른 글
컨테이너 로깅(Container Logging) (0) 2022.03.12 도커 네트워크(Docker Network) (0) 2022.03.09 도커 볼륨(Docker Volume) (0) 2022.03.06 도커 엔진(Docker Engine) (0) 2022.02.26 도커(Docker) (0) 2022.02.26