도커 관리 · 9 min read · Feb 05, 2026

우분투에서 도커로 리눅스 컨테이너 관리 - 페이지 2

4.2 도커파일로 이미지 빌드하기

도커파일은 도커 이미지를 빌드하기 위한 지침을 포함한 기본 DSL을 사용합니다. 그런 다음 도커파일의 지침을 사용하여 새 이미지를 빌드하기 위해 docker build 명령을 사용합니다. Docker, Inc. 팀은 도커파일을 빌드하는 방법을 배우는 데 도움이 되는 도커파일 튜토리얼도 여기에 게시했습니다.

이제 사용자의 요구에 따라 추가로 개선할 수 있는 간단한 도커 파일을 만들겠습니다. 먼저 디렉토리를 만듭니다. dir=kishore로 가정합니다:

mkdir kishore  
cd kishore

이제 다음과 같이 도커파일을 만듭니다:

vi Dockerfile  

& 다음과 같은 내용을 입력합니다:

| FROM ubuntu:12.04 MAINTAINER Srijan Kishore <[email protected]> RUN apt-get -qq update RUN apt-get -qqy install apache2 |

이제 사용자 정의 컨테이너를 열려면 다음을 사용합니다:

sudo docker build -t="srijan/custom1" .

다음과 같은 결과가 나옵니다:

srijan@vboxtest:~/kishore$ sudo docker build -t="srijan/custom1" .
[sudo] password for srijan: 
Sending build context to Docker daemon  2.56 kB
Sending build context to Docker daemon 
Step 0 : FROM ubuntu:12.04
Pulling repository ubuntu
ea7d6801c538: Download complete 
511136ea3c5a: Download complete 
65b7e9ccb809: Download complete 
f8dd6bd14f58: Download complete 
a343823119db: Download complete 
 ---> ea7d6801c538
Step 1 : MAINTAINER Srijan Kishore <[email protected]>
 ---> Running in a6135f405eb4
 ---> be97c22efa82
Removing intermediate container a6135f405eb4
Step 2 : RUN apt-get -qq update
 ---> Running in b5681cd85ba8
 ---> cbc3a95de894
Removing intermediate container b5681cd85ba8
Step 3 : RUN apt-get -qqy install apache2
 ---> Running in 5765c09b530f
debconf: delaying package configuration, since apt-utils is not installed
Selecting previously unselected package libsqlite3-0.
(Reading database ... 7551 files and directories currently installed.)
Unpacking libsqlite3-0 (from .../libsqlite3-0_3.7.9-2ubuntu1.1_amd64.deb) ...
Selecting previously unselected package libroken18-heimdal.
Unpacking libroken18-heimdal (from .../libroken18-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb) ...
Selecting previously unselected package libasn1-8-heimdal.
Unpacking libasn1-8-heimdal (from .../libasn1-8-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb) ...
Selecting previously unselected package libgpg-error0.
Unpacking libgpg-error0 (from .../libgpg-error0_1.10-2ubuntu1_amd64.deb) ...
Selecting previously unselected package libgcrypt11.
Unpacking libgcrypt11 (from .../libgcrypt11_1.5.0-3ubuntu0.2_amd64.deb) ...
Selecting previously unselected package libgdbm3.
Unpacking libgdbm3 (from .../libgdbm3_1.8.3-10_amd64.deb) ...
Selecting previously unselected package libp11-kit0.
Unpacking libp11-kit0 (from .../libp11-kit0_0.12-2ubuntu1_amd64.deb) ...
Selecting previously unselected package libtasn1-3.
Unpacking libtasn1-3 (from .../libtasn1-3_2.10-1ubuntu1.1_amd64.deb) ...
Selecting previously unselected package libgnutls26.
Unpacking libgnutls26 (from .../libgnutls26_2.12.14-5ubuntu3.8_amd64.deb) ...
Selecting previously unselected package libhcrypto4-heimdal.
Unpacking libhcrypto4-heimdal (from .../libhcrypto4-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb) ...
Selecting previously unselected package libheimbase1-heimdal.
Unpacking libheimbase1-heimdal (from .../libheimbase1-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb) ...
Selecting previously unselected package libwind0-heimdal.
Unpacking libwind0-heimdal (from .../libwind0-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb) ...
Selecting previously unselected package libhx509-5-heimdal.
Unpacking libhx509-5-heimdal (from .../libhx509-5-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb) ...
Selecting previously unselected package libkrb5-26-heimdal.
Unpacking libkrb5-26-heimdal (from .../libkrb5-26-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb) ...
Selecting previously unselected package libheimntlm0-heimdal.
Unpacking libheimntlm0-heimdal (from .../libheimntlm0-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb) ...
Selecting previously unselected package libgssapi3-heimdal.
Unpacking libgssapi3-heimdal (from .../libgssapi3-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb) ...
Selecting previously unselected package libsasl2-2.
Unpacking libsasl2-2 (from .../libsasl2-2_2.1.25.dfsg1-3ubuntu0.1_amd64.deb) ...
Selecting previously unselected package libldap-2.4-2.
Unpacking libldap-2.4-2 (from .../libldap-2.4-2_2.4.28-1.1ubuntu4.4_amd64.deb) ...
Selecting previously unselected package libcap2.
Unpacking libcap2 (from .../libcap2_1%3a2.22-1ubuntu3_amd64.deb) ...
Selecting previously unselected package libexpat1.
Unpacking libexpat1 (from .../libexpat1_2.0.1-7.2ubuntu1.1_amd64.deb) ...
Selecting previously unselected package libmagic1.
Unpacking libmagic1 (from .../libmagic1_5.09-2ubuntu0.3_amd64.deb) ...
Selecting previously unselected package file.
Unpacking file (from .../file_5.09-2ubuntu0.3_amd64.deb) ...
Selecting previously unselected package mime-support.
Unpacking mime-support (from .../mime-support_3.51-1ubuntu1_all.deb) ...
Selecting previously unselected package netbase.
Unpacking netbase (from .../netbase_4.47ubuntu1_all.deb) ...
Selecting previously unselected package libsasl2-modules.
Unpacking libsasl2-modules (from .../libsasl2-modules_2.1.25.dfsg1-3ubuntu0.1_amd64.deb) ...
Selecting previously unselected package openssl.
Unpacking openssl (from .../openssl_1.0.1-4ubuntu5.16_amd64.deb) ...
Selecting previously unselected package libapr1.
Unpacking libapr1 (from .../libapr1_1.4.6-1_amd64.deb) ...
Selecting previously unselected package libaprutil1.
Unpacking libaprutil1 (from .../libaprutil1_1.3.12+dfsg-3_amd64.deb) ...
Selecting previously unselected package libaprutil1-dbd-sqlite3.
Unpacking libaprutil1-dbd-sqlite3 (from .../libaprutil1-dbd-sqlite3_1.3.12+dfsg-3_amd64.deb) ...
Selecting previously unselected package libaprutil1-ldap.
Unpacking libaprutil1-ldap (from .../libaprutil1-ldap_1.3.12+dfsg-3_amd64.deb) ...
Selecting previously unselected package apache2.2-bin.
Unpacking apache2.2-bin (from .../apache2.2-bin_2.2.22-1ubuntu1.6_amd64.deb) ...
Selecting previously unselected package apache2-utils.
Unpacking apache2-utils (from .../apache2-utils_2.2.22-1ubuntu1.6_amd64.deb) ...
Selecting previously unselected package libswitch-perl.
Unpacking libswitch-perl (from .../libswitch-perl_2.16-2_all.deb) ...
Selecting previously unselected package libclass-isa-perl.
Unpacking libclass-isa-perl (from .../libclass-isa-perl_0.36-3_all.deb) ...
Selecting previously unselected package perl-modules.
Unpacking perl-modules (from .../perl-modules_5.14.2-6ubuntu2.4_all.deb) ...
Selecting previously unselected package perl.
Unpacking perl (from .../perl_5.14.2-6ubuntu2.4_amd64.deb) ...
Selecting previously unselected package apache2.2-common.
Unpacking apache2.2-common (from .../apache2.2-common_2.2.22-1ubuntu1.6_amd64.deb) ...
Selecting previously unselected package apache2-mpm-worker.
Unpacking apache2-mpm-worker (from .../apache2-mpm-worker_2.2.22-1ubuntu1.6_amd64.deb) ...
Selecting previously unselected package apache2.
Unpacking apache2 (from .../apache2_2.2.22-1ubuntu1.6_amd64.deb) ...
Selecting previously unselected package ssl-cert.
Unpacking ssl-cert (from .../ssl-cert_1.0.28ubuntu0.1_all.deb) ...
Setting up libsqlite3-0 (3.7.9-2ubuntu1.1) ...
Setting up libroken18-heimdal (1.6~git20120311.dfsg.1-2ubuntu0.1) ...
Setting up libasn1-8-heimdal (1.6~git20120311.dfsg.1-2ubuntu0.1) ...
Setting up libgpg-error0 (1.10-2ubuntu1) ...
Setting up libgcrypt11 (1.5.0-3ubuntu0.2) ...
Setting up libgdbm3 (1.8.3-10) ...
Setting up libp11-kit0 (0.12-2ubuntu1) ...
Setting up libtasn1-3 (2.10-1ubuntu1.1) ...
Setting up libgnutls26 (2.12.14-5ubuntu3.8) ...
Setting up libhcrypto4-heimdal (1.6~git20120311.dfsg.1-2ubuntu0.1) ...
Setting up libheimbase1-heimdal (1.6~git20120311.dfsg.1-2ubuntu0.1) ...
Setting up libwind0-heimdal (1.6~git20120311.dfsg.1-2ubuntu0.1) ...
Setting up libhx509-5-heimdal (1.6~git20120311.dfsg.1-2ubuntu0.1) ...
Setting up libkrb5-26-heimdal (1.6~git20120311.dfsg.1-2ubuntu0.1) ...
Setting up libheimntlm0-heimdal (1.6~git20120311.dfsg.1-2ubuntu0.1) ...
Setting up libgssapi3-heimdal (1.6~git20120311.dfsg.1-2ubuntu0.1) ...
Setting up libsasl2-2 (2.1.25.dfsg1-3ubuntu0.1) ...
Setting up libldap-2.4-2 (2.4.28-1.1ubuntu4.4) ...
Setting up libcap2 (1:2.22-1ubuntu3) ...
Setting up libexpat1 (2.0.1-7.2ubuntu1.1) ...
Setting up libmagic1 (5.09-2ubuntu0.3) ...
Setting up file (5.09-2ubuntu0.3) ...
Setting up mime-support (3.51-1ubuntu1) ...
update-alternatives: using /usr/bin/see to provide /usr/bin/view (view) in auto mode.
Setting up netbase (4.47ubuntu1) ...
Setting up libsasl2-modules (2.1.25.dfsg1-3ubuntu0.1) ...
Setting up openssl (1.0.1-4ubuntu5.16) ...
Setting up libapr1 (1.4.6-1) ...
Setting up libaprutil1 (1.3.12+dfsg-3) ...
Setting up libaprutil1-dbd-sqlite3 (1.3.12+dfsg-3) ...
Setting up libaprutil1-ldap (1.3.12+dfsg-3) ...
Setting up apache2.2-bin (2.2.22-1ubuntu1.6) ...
Setting up apache2-utils (2.2.22-1ubuntu1.6) ...
Setting up libclass-isa-perl (0.36-3) ...
Setting up ssl-cert (1.0.28ubuntu0.1) ...
debconf: unable to initialize frontend: Dialog
debconf: (TERM is not set, so the dialog frontend is not usable.)
debconf: falling back to frontend: Readline
debconf: unable to initialize frontend: Readline
debconf: (This frontend requires a controlling tty.)
debconf: falling back to frontend: Teletype
Setting up libswitch-perl (2.16-2) ...
Setting up perl-modules (5.14.2-6ubuntu2.4) ...
Setting up perl (5.14.2-6ubuntu2.4) ...
update-alternatives: using /usr/bin/prename to provide /usr/bin/rename (rename) in auto mode.
Setting up apache2.2-common (2.2.22-1ubuntu1.6) ...
Enabling site default.
Enabling module alias.
Enabling module autoindex.
Enabling module dir.
Enabling module env.
Enabling module mime.
Enabling module negotiation.
Enabling module setenvif.
Enabling module status.
Enabling module auth_basic.
Enabling module deflate.
Enabling module authz_default.
Enabling module authz_user.
Enabling module authz_groupfile.
Enabling module authn_file.
Enabling module authz_host.
Enabling module reqtimeout.
Setting up apache2-mpm-worker (2.2.22-1ubuntu1.6) ...
invoke-rc.d: policy-rc.d denied execution of start.
Setting up apache2 (2.2.22-1ubuntu1.6) ...
Processing triggers for libc-bin ...
ldconfig deferred processing now taking place
 ---> 634855a43331
Removing intermediate container 5765c09b530f
Successfully built 634855a43331
srijan@vboxtest:~/kishore$

이제 새 이미지를 살펴보겠습니다. 이를 위해 docker images 명령을 사용할 수 있습니다.

docker images srijan/custom1
srijan@vboxtest:~/kishore$ docker images srijan/custom1
REPOSITORY          TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
srijan/custom1      latest              634855a43331        About a minute ago   277.4 MB
srijan@vboxtest:~/kishore$

여기에서 기본적으로 apache2가 설치된 이미지를 찾을 수 있습니다. 다음과 같이 확인해 보겠습니다:

docker run -t -i srijan/apache2:webserver /bin/bash

이제 12.04ubuntu가 미리 설치된 apache2가 있는 새 컨테이너로 들어가게 됩니다.

5 호스트 이름 변경

호스트 이름을 변경하거나 사용자 정의 호스트 이름(예: server1.example.com)을 원한다고 가정해 보겠습니다.

다음과 같이 사용할 것입니다:

docker run -h 'server1.example.com' -t -i srijan/custom1 /bin/bash

그 결과 이미지 컨테이너는 다음과 같습니다:

srijan@vboxtest:~/kishore$ docker run -h 'server1.example.com' -t -i srijan/custom1 /bin/bash
root@server1:/# hostname -f
server1.example.com
root@server1:/#

6 도커에 유용한 명령어들

  • pull (pull은 레지스트리에서 이미지나 리포지토리를 가져오는 데 사용됩니다)
    예:
docker run -i -t ubuntu /bin/bash
  • commit (commit은 컨테이너를 저장하는 데 사용됩니다)
    예:
docker commit 73527b8b4261 srijan/apache2 8ce0ea7a1528
  • cp (컨테이너의 파일/폴더를 호스트 경로로 복사합니다. 경로는 파일 시스템의 루트에 상대적입니다.)
    예:
docker cp CONTAINER:PATH HOSTPATH

여기서 CONTAINER는 컨테이너이며 PATH에서 HOSTPATH로 파일/폴더를 복사합니다.

  • startstop 컨테이너:
docker start 4386fb97867d
docker stop 4386fb97867d

여기서 4386fb97867d는 컨테이너 번호입니다.

  • export (파일 시스템의 내용을 tar 아카이브로 STDOUT으로 내보냅니다)
docker export 4386fb97867d > latest.tar
  • import (빈 파일 시스템 이미지를 만들고 tarball(.tar, .tar.gz, .tgz, .bzip, .tar.xz, .txz)의 내용을 가져온 후 선택적으로 태그를 지정합니다.)
docker import http://example.com/exampleimage.tgz

로컬 파일에서 가져오기:
파이프와 stdin을 통해 도커로 가져옵니다.

cat exampleimage.tgz | sudo docker import - exampleimagelocal:new

로컬 디렉토리에서 가져오기:

sudo tar -c . | sudo docker import - exampleimagedir

  • history (이미지의 히스토리를 표시합니다)
docker history [OPTIONS] IMAGE
sudo docker history  ea7d6801c538
  • images (이미지를 표시합니다)
docker images [OPTIONS] [NAME]

다음과 같은 옵션을 따릅니다.

-a, –all=false 모든 이미지를 표시합니다(기본적으로 중간 이미지 레이어는 필터링됨)
-f, –filter=[]: 필터 값을 제공합니다(예: ‘dangling=true’)
–no-trunc=false 출력을 잘라내지 않습니다
-q, –quiet=false 숫자 ID만 표시합니다

  • info (시스템 전체 정보를 표시합니다)
srijan@VE130214:~$ sudo docker info
srijan@vboxtest:~$ sudo docker info
Containers: 20
Images: 65
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Dirs: 105
Execution Driver: native-0.2
Kernel Version: 3.13.0-30-generic
WARNING: No swap limit support
  • inspect (컨테이너/이미지에 대한 저수준 정보를 반환합니다)
docker inspect CONTAINER|IMAGE [CONTAINER|IMAGE...]
  • kill (실행 중인 컨테이너를 종료하거나 SIGKILL 또는 지정된 신호를 보냅니다)
docker kill [OPTIONS] CONTAINER [CONTAINER...]
  • login (도커 레지스트리 서버에 등록하거나 로그인합니다. 서버가 지정되지 않으면 “ https://index.docker.io/v1/ “가 기본값입니다.)
docker login localhost:8080  

자체 호스팅된 레지스트리에 로그인합니다.

  • logs (컨테이너의 로그를 가져옵니다)
docker logs CONTAINER
  • ps (컨테이너 목록)
docker ps [OPTIONS]

다음과 같은 옵션이 있습니다:

-a, –all=false 모든 컨테이너를 표시합니다. 기본적으로 실행 중인 컨테이너만 표시됩니다.
–before=”” Id 또는 이름 이전에 생성된 컨테이너만 표시하며, 비실행 중인 것도 포함됩니다.
-l, –latest=false 가장 최근에 생성된 컨테이너만 표시하며, 비실행 중인 것도 포함됩니다.
-n=-1 마지막으로 생성된 n개의 컨테이너를 표시하며, 비실행 중인 것도 포함됩니다.
–no-trunc=false 출력을 잘라내지 않습니다
-q, –quiet=false 숫자 ID만 표시합니다
-s, –size=false 크기를 표시합니다
–since=”” Id 또는 이름 이후에 생성된 컨테이너만 표시하며, 비실행 중인 것도 포함됩니다.

  • push (이미지나 리포지토리를 레지스트리에 푸시합니다)
docker push NAME[:TAG]
  • restart (실행 중인 컨테이너를 재시작합니다)
docker restart [OPTIONS] CONTAINER [CONTAINER...]
  • rm (하나 이상의 컨테이너를 제거합니다)
docker rm [OPTIONS] CONTAINER [CONTAINER...]
  • rmi (하나 이상의 이미지를 제거합니다)
docker rmi IMAGE [IMAGE...]
  • run (새 컨테이너에서 명령을 실행합니다)
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

다음과 같은 옵션이 있습니다:

-a, –attach=[] stdin, stdout 또는 stderr에 연결합니다.
-c, –cpu-shares=0 CPU 점유율(상대적 가중치)
–cidfile=”” 컨테이너 ID를 파일에 기록합니다
-d, –detach=false 분리 모드: 백그라운드에서 컨테이너를 실행하고 새 컨테이너 ID를 인쇄합니다
–dns=[] 사용자 정의 DNS 서버를 설정합니다
–dns-search=[] 사용자 정의 DNS 검색 도메인을 설정합니다
-e, –env=[] 환경 변수를 설정합니다
–entrypoint=”” 이미지의 기본 엔트리포인트를 덮어씁니다
–env-file=[] ENV 변수가 포함된 줄 구분 파일을 읽습니다
–expose=[] 컨테이너에서 호스트에 게시하지 않고 포트를 노출합니다
-h, –hostname=”” 컨테이너 호스트 이름
-i, –interactive=false 연결되지 않은 경우에도 stdin을 열어 둡니다
–link=[] 다른 컨테이너에 링크를 추가합니다(이름:별칭)
–lxc-conf=[] (lxc exec-driver 전용) 사용자 정의 lxc 옵션 추가 –lxc-conf=”lxc.cgroup.cpuset.cpus = 0,1”
-m, –memory=”” 메모리 제한(형식: <숫자><선택적 단위>, 단위는 b, k, m 또는 g)
–name=”” 컨테이너에 이름을 할당합니다
–net=”bridge” 컨테이너의 네트워크 모드를 설정합니다
‘bridge’: 도커 브리지에서 컨테이너를 위한 새로운 네트워크 스택을 생성합니다
‘none’: 이 컨테이너에 대한 네트워킹이 없습니다
‘container:’: 다른 컨테이너 네트워크 스택을 재사용합니다
‘host’: 컨테이너 내부에서 호스트 네트워크 스택을 사용합니다
-p, –publish=[] 컨테이너의 포트를 호스트에 게시합니다
형식: ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort
(‘docker port’를 사용하여 실제 매핑을 확인합니다)
-P, –publish-all=false 모든 노출된 포트를 호스트 인터페이스에 게시합니다
–privileged=false 이 컨테이너에 확장된 권한을 부여합니다
–rm=false 종료 시 컨테이너를 자동으로 제거합니다( -d와 호환되지 않음)
–sig-proxy=true 수신된 모든 신호를 프로세스에 프록시합니다(비TTY 모드에서도)
-t, –tty=false 가상 tty를 할당합니다
-u, –user=”” 사용자 이름 또는 UID
-v, –volume=[] 볼륨을 바인드 마운트합니다(예: 호스트에서: -v /host:/container, 도커에서: -v /container)
–volumes-from=[] 지정된 컨테이너에서 볼륨을 마운트합니다
-w, –workdir=”” 컨테이너 내부의 작업 디렉토리

  • save (이미지를 tar 아카이브로 저장합니다(기본적으로 stdout으로 스트리밍됨)
docker save IMAGE
  • search (이미지에 대한 도커 인덱스를 검색합니다)
docker search TERM
  • tag (이미지를 리포지토리에 태그합니다)
docker tag [OPTIONS] IMAGE [REGISTRYHOST/][USERNAME/]NAME[:TAG]
  • top (컨테이너의 실행 중인 프로세스를 조회합니다)
docker top CONTAINER [ps OPTIONS]
  • version (도커 버전 정보를 표시합니다.)
sudo docker version
srijan@vboxtest:~$ sudo docker version
[sudo] password for srijan: 
Client version: 1.0.1
Client API version: 1.12
Go version (client): go1.2.1
Git commit (client): 990021a
Server version: 1.0.1
Server API version: 1.12
Go version (server): go1.2.1
Git commit (server): 990021a

6 요약

도커에 대해 더 친숙해지도록 노력했습니다. 이 가이드가 도커를 이해하고 테스트/생산 환경에서 도커를 활용하는 데 도움이 되기를 바랍니다.

자세한 내용은 http://www.docker.com/ 를 참조하세요.

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.