컨테이너의 생성과 삭제, 실행, 정지
- 컨테이너를 실행할 때 : docker run
- 도커 컨테이너를 생성하고 실행하는 기능도 하고, 필요한 이미지가 없다면 이미지 내려받는 기능도 같이한다.
- 도커 컨테이너는 만들고 폐기하는 단계까지가 생애주기다.
동작 중인 컨테이너를 그대로 삭제할 수 없기 때문에 컨테이너를 폐기하려면 컨테이너를 정지시켜야 한다.
- 컨테이너 정지 : docker stop(docker container stop)
- 컨테이너 삭제 : docker rm(docker container rm)
docker run
컨테이너의 이름 --name 옵션, 포트 번호 -p, 볼륨을 만운트할 때는 -v, 컨테이너를 연결할 네트워크는 --net 옵션 등을 사용할 수 있다
docker run (옵션) 이미지 (인자)
컨테이너의 생애주기를 관장하는 커맨드 외에 자주 사용하게 될 커맨드가 한 가지 더 있는데, 이 커맨드가 바로 docker ps(docker container ls)다.
- 현재 실행 중인 컨테이너의 목록을 출력하며, docker ps -a옵션을 추가하면 존재하는 컨테이너(정지 상태의 컨테이너를 포함)의 목록을 출력한다.
docker ps (옵션)
커맨드의 정식 명칭은 ls이지만 생략형이 ps다.
- 실행 중인 컨테이너의 목록 출력 : docker ps
- 현재 존재하는 컨테이너의 목록 출력 : docker ps -a
docker ps를 실행하면
- 첫 번째 행 : 각 항목의 이름이 출력
- 두 번째 행부터 : 실제 컨테이너 정보가 출력된다.
| 항목 | 내용 |
| CONTAINER ID | 컨테이너 식별자, 무작위 문자열이 할당된다. 원래 64글자지만 앞에서부터 12글자만 출력한다. |
| IMAGE | 컨테이너를 만들 때 사용한 이미지 이름 |
| COMMAND | 컨테이너 실행 시에 실행하도록 설정된 프로그램의 이름, 크게 신경 쓰지 않아도 된다. |
| CREATED | 컨테이너 생성 후 경과된 시간 |
| STATUS | 컨테이너의 현재 상태. 실행 중이라면 'Up', 종료된 상태라면 'Exited'가 출력된다. |
| PORTS | 컨테이너에 할당된 포트 번호. '호스트 포트 번호 -> 컨테이너 포트 번호' 형식으로 출력된다.<br />포트 번호가 동일할 경우 ->의 뒷부분은 출력되지 않는다. |
| NAMES | 컨테이너 이름 |
실습

처음에 실행했을 때 해당 이미지가 없었지만 run을 실행함으로써 자동으로 실행과 동시에 이미지를 pull하고 컨테이너를 생성하고 실행까지 완료됐다.
또한 docker ps를 통해 실행 중인 컨테이너의 목록을 확인할 수 있다.

docker stop apa000ex1으로 컨테이너를 종료한 걸 볼 수 있다.
docker rm apa000ex1으로 컨테이너를 삭제할 수 있다.
컨테이너 통신
아파치란?
: 웹 서버 기능을 제공하는 소프트웨어
컨테이너가 컨테이너 외부에서 접근이 불가능한 상태로 실행되기 때문에 웹 부라우저를 통해 컨테이너에 접근이 가능하게 하려면 컨테이너를 실행할 때 설정이 필요하다. 또한 이 설정은 컨테이너를 생성한 후에는 기본적으로 변경할 수 없다. 따라서 docker run 커맨드에 옵션 형태로 설정한다.
컨테이너와 통신하려면
- 포트 설정하기
- ※ 포트 : 통신 내용이 드나드는 통로
- 아파치는 서버에서 정해둔 포트(80번 포트)에서 웹사이트에 대한 접근을 기다리다가 사용자가 이 포트를 통해 접근해 오면 요청에 따라 웹 사이트의 페이지를 제공한다.
- 하지만 컨테이너 속에서 실행 중인 아파치는 외부와 직접 연결되지 않았기 때문에 외부에서 접근할 수 없다.
- 따라서 컨테이너를 실행 중인 물리적 컴퓨터가 외부의 접근을 대신 받아 전달해 준다.
좀 더 구체적으로 설명하면 컨테이너를 실행 중인 컴퓨터 8080번 포트와 컨테이너의 80번 포트를 연결한다.
이 설정이 -p 옵션이며, 그 뒤로 '호스트의 포트 번호'와 '컨테이너의 포트 번호'를 콜론으로 연결해 함께 기재한다.
포트 설정 방법
-p 호스트_포트_번호 : 컨테이너_포트_번호
-p : 포트를 지정하는 옵션
ex) -p 8080 : 80
컨테이너를 사용하면 여러 개의 웹 서버를 함께 실행할 수도 있다. 이러한 경우 호스트 포트 번호를 모두 같은 것으로 사용하면 어떤 컨테이너로 가야할 요청인지 구분할 수 없기 때문에 컨테이너 A에는 호스트 포트 8080, 컨테이너 B에는 호스트 포트 8081과 같은 식으로 호스트 포트 번호가 겹치지 않게 한다.
※ 컨테이너_ 포트_번호는 동일해도 무방하다.
도커로 실행하여 아파치 초기 화면 실행해 보기
먼저 docker run --name apa000ex2 -d -p 8080:80 httpd를 이용해 컨테이너를 생성하고 포트를 포워딩해보겠다.

이미 앞선 예제에서 httpd 이미지를 내려받았으므로 이번에는 pull과 관련된 정보는 출력되지 않는다. 실행 결과에 출력되는 무작위 문자열은 컨테이너 ID이므로 실행할 때마다 달라진다.
그 다음 http://localhost:8080/에 접근해 아파치의 초기 화면이 나타나는지 확인한다.

정상적으로 잘 실행되는 것을 볼 수 있다.

그 다음 실습을 종료하기에 앞서 생성한 컨테이너를 정지 후 삭제해주면 끝난다.
컨테이너 생성에 익숙해지기
이번에는 아파치 이외의 소프트웨어가 담긴 여러 가지 컨테이너를 생성해보며 컨테이너를 생성하는 연습을 진행해 보겠다.
리눅스 운영체제가 담긴 컨테이너
리눅스 운영체제만 담겨 제공되는 컨테이너도 다양한 종류가 있다. 리눅스 운영체제 컨테이너는 컨테이너 속 파일 시스템을 다루는 것을 전제로 하므로 인자로 '셸 명령어'를 지정한다.
| 이미지 이름 | 컨테이너의 내용 | 컨테이너 실행에 주로 사용되는 옵션 및 인자 |
| ubuntu | 우분투 | -d 없이 -it옵션만 사용. 인자로는 /bin/bash 등 셸 명령어를 지정한다. |
| centos | CentOS | -d 없이 -it옵션만 사용. 인자로는 /bin/bash 등 셸 명령어를 지정한다. |
| debian | 데비안 | -d 없이 -it옵션만 사용. 인자로는 /bin/bash 등 셸 명령어를 지정한다. |
| fedora | 페도라 | -d 없이 -it옵션만 사용. 인자로는 /bin/bash 등 셸 명령어를 지정한다. |
| busybox | BizyBox | -d 없이 -it옵션만 사용. 인자로는 /bin/bash 등 셸 명령어를 지정한다. |
| alpine | 알파인 리눅스 | -d 없이 -it옵션만 사용. 인자로는 /bin/bash 등 셸 명령어를 지정한다. |
웹 서버/데이터베이스 서버용 컨테이너
웹 서버 소프트웨어로는 아파치 외에도 nginx가 유명하다. nginx는 이번 장에서 실습으로 다루게 될 예정이다.
웹 서버 통신이 전제가 되므로 옵션을 통해 포트 번호를 지정해야 한다.
데이터베이스 서버는 MySQL 외에 PostgreSQL이나 MariaDB도 유명하다.
- 데이터베이스 관리 소프트웨어는 기본적으로 루트 패스워드를 반드시 지정해야 한다.\
| 이미지 이름 | 컨테이너의 내용 | 컨테이너 실행에 주로 사용되는 옵션 및 인자 |
| httpd | Apache | -d로 백그라운드로 실행, -p로 포트 번호 지정 |
| nginx | Nginx | -d로 백그라운드로 실행, -p로 포트 번호 지정 |
| mysql | MySQL | -d 사용, 실행 시 -e MYSQL_ROOT_PASSWORD와 같이 루트 패스워드를 지정 |
| postgre | PostgreSQL | -d 사용, 실행 시 -e POSTGRES_ROOT_PASSWORD와 같이 루트 패스워드를 지정 |
| mariadb | MariaDB | -d 사용, 실행 시 -e MYSQL_ROOT_PASSWORD와 같이 루트 패스워드를 지정 |
프로그램 실행을 위한 런타임과 그 외 소프트웨어
프로그램을 실행하려면 해당 언어의 실행 환경인 런타임이 필요하다. 런타임 역시 컨테이너 형태로 제공된다.
| 이미지 이름 | 컨테이너의 내용 | 컨테이너 실행에 주로 사용되는 옵션 및 인자 |
| openjdk | 자바 런타임 | -d를 사용하지 않고, 인자로 java 명령 등을 지정해 도구 형태로 사용한다. |
| python | 파이썬 런타임 | -d를 사용하지 않고, 인자로 python명령 등을 지정해 도구 형태로 사용한다. |
| php | PHP 런타임 | 웹 서버가 포함된 것과 실행 명령만 포함된 것으로 나뉘어 제공된다. |
| ruby | 루비 런타임 | 웹 서버가 포함된 것과 실행 명령만 포함된 것으로 나뉘어 제공된다. |
| perl | 펄 런타임 | -d를 사용하지 않고, 인자로 perl 명령 등을 지정해 도구 형태로 사용한다. |
| gcc | C/C++ 컴파일러 | -d를 사용하지 않고, 인자로 gcc 명령 등을 지정해 도구 형태로 사용한다. |
| node | Node.js | -d를 사용하지 않고, 인자로 app 명령 등을 지정해 도구 형태로 사용한다. |
| registry | 도커 레지스트리 | -d 옵션을 사용해 백그라운드로 실행하며, -p옵션으로 포트 번호를 지정한다. |
| wordpress | WordPress | -d 옵션을 사용해 백드라운드로 실행하며, -p 옵션으로 포트 번호를 지정한다. MySQL 또는 MariaDB가 필요하다. 접속에 필요한 패스워드는 -e 옵션으로 지정한다. |
| nextcloud | NextCloud | -d 옵션을 사용해 백드라운드로 실행한다. -p 옵션으로 포트 번호를 지정한다. |
| redmine | Redmine | -d 옵션을 사용해 백드라운드로 실행하며, -p 옵션을 포트 번호를 지정한다. PostgreSQL 또는 MySQL이 필요하다. |

생성 후 docker ps로 목록을 다 볼 수 있다. 이제 http://localhost:8081~8083을 입력하면 아파치 초기 화면이 나타나는지 확인한다.
Nginx 컨테이너 실행하기

docker run --name nginx000ex6 -d -p 8084:80 nginx를 이용해 이미지를 pull 받아와서 실행할 수 있다.

MySQL 컨테이너 실행하기

얘는 아파치나 Nginx에 비해 컨테이너를 만드는 과정이 까다롭다. 그 이유는 제대로 동작하게 하려면 인자를 반드시 지정해야 되기 때문이다.
이미지 삭제하기
이미지를 삭제하기 위해서는 docker image rm 커맨드를 사용한다.
이미지를 삭제하는 커맨드 : docker image rm
docker image rm 이미지_이름
docker image rm 이미지_이름 이미지_이름 이미지_이름 // 여러 개의 이미지를 삭제하는 경우
docker image ls : 이미지는 생략형도 ls이다. 따라서 옵션 -a를 사용할 수 없다. 이미지는 컨테이너와 달리 '실행 중', '종료' 등의 상태를 가질 수 없기 때문이다.

'도커' 카테고리의 다른 글
| 5. 도커 - 컨테이너와 호스트 간에 파일 복사하기 (3) | 2025.08.11 |
|---|---|
| 4. 도커 - 여러 개의 컨테이너 연동해 보기 (3) | 2025.07.31 |
| 2. 도커 엔진 (3) | 2025.07.28 |
| 1. 도커 개념 정리 (0) | 2025.07.26 |