Skip to main content

컨테이너 빌드

루트 유저가 아닌 현재 유저에서 도커 명령어 사용 설정


sudo groupadd docker
sudo usermod -aG docker $USER
sudo chmod 666 /var/run/docker.sock

Dockerfile 생성 및 컨테이너 생성

# 디렉토리 생성 및 이동
mkdir -p build/web && cd build/web

# Dockerfile 생성
vi Dockerfile
FROM centos:7.5.1804
RUN yum install httpd -y
RUN echo "Welcome to FC" > /var/www/html/index.html
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]

# docker 이미지 생성 [이름]:[태그]
docker build -t web:v1 .

# 이미지 생성 확인
docker images

# 도커 컨테이너 실행
# --name [컨테이너명] [이미지명]:[태그]
docker run -d --name web web:v1

# 컨테이너 생성 확인
docker ps

# 컨테이너 상세 확인, 컨테이너 아이피 확인
docker inspect web

curl 172.17.0.2

# 컨테이너 정지
docker stop web

# 컨테이너 삭제
docker rm web

TroubleShooting1: 기존 Dockerfile 빌드시 에러 발생

vi Dockerfile

FROM centos:7.5.1804
RUN yum install httpd -y
RUN echo "Welcome to FC" > /var/www/html/index.html
CMD ["/usr/bin/httpd", "-D", "FOREGROUND"]
docker build -t web:v1 .
docker run -d --name web web:v1

Error

docker: Error response from daemon: failed to create shim: OCI runtime create failed: runc create failed: unable to start container process: exec: "/usr/bin/httpd": stat /usr/bin/httpd: no such file or directory: unknown.

위 Dockerfile을 아래와 같이 변경 - /usr/sbin/httpd로 경로 수정

FROM centos:7.5.1804
RUN yum install httpd -y
RUN echo "Welcome to FC" > /var/www/html/index.html
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
TroubleShooting2

Error

Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

Solution

vi /etc/resolv.conf

nameserver 8.8.8.8
nameserver 8.8.4.4
nameserver 127.0.0.53

Dockerfile에 대하여

  • 컨테이너 빌드를 위한 명령어의 집합으로 쉽고 간단하며 명확한 구문을 갖는 텍스트 파일

  • 다양한 인스트럭션 지원

    • 대소문자를 구분하지 않지만 높은 가독성을 위해 대문자 사용
    • 이미지 생성을 위한 핵심 요소

  • FROM - 컨테이너의 BASE IMAGE (운영 환경)
  • LABEL - 컨테이너 빌더의 정보, 버전과 같은 부가정보 제공
  • RUN - 컨테이너 빌드를 위해 base image에서 실행할 commands
  • ADD - 컨테이너 빌드 시 호스트의 파일(tar, url 포함)을 컨테이너로 복사
  • COPY - 컨테이너 빌드 시 호스트의 파일을 컨테이너로 복사
  • WORKDIR - 컨테이너 빌드 시 명령이 실행될 작업 디렉토리 설정
  • ENV - 환경변수 지정
  • USER - 명령 및 컨테이너 실행 시 적용할 유저 설정
  • EXPOSE - 컨테이너 동작 시 외부에서 사용할 포트 지정
  • CMD - 컨테이너 동작 시 자동으로 실행할 서비스
  • ENTRYPOINT - CMD와 함께 사용하면서 command 지정 시 사용

도커 컨테이너 라이프 사이클

container-build1

container-build2

docker run \

-i \호스트의 표준 입력을 컨테이너와 연결 (interactive)
-t \TTY 할당
—rm \컨테이너 실행 종료 후 자동 삭제
-d \백그라운드 모드로 실행 (detached) 데몬
—name hello-world \컨테이너 이름 지정
-p 80:80 \호스트 - 컨테이너 간 포트 바인딩
-v /opt/example:/example \호스트 - 컨테이너 간 볼륨 바인딩
[repository-name]/[image-name]:[tag-name] \실행할 이미지
my-command컨테이너 내에서 실행할 명령어

Command

사용하지 않는 모든 컨테이너 일괄 삭제

docker container prune

사용하지 않는 모든 이미지 삭제

docker image prune

사용하지 않는 모든 네트워크 삭제

docker network prune
사용하지 않는 모든 볼륨 삭제
docker volume prune

사용하지 않는 모든 Docker Object 삭제

docker system prune

- 실행중인 컨테이너 상태 확인
docker ps

- 전체 컨테이너 상태 확인
docker ps -a

- 컨테이너 상세 정보 확인
docker inspect [container]

- 컨테이너 중지
docker pause [container]

- 컨테이너 재개
docker unpause [container]

- 컨테이너 종료 (SIGTERM 시그널 전달)
docker stop [container]

- 컨테이너 강제 종료 (SIGKILL 시그널 전달)
docker kill [container]

- 모든 컨테이너 종료
docker stop $(docker ps -a -q)

- 컨테이너 삭제 (실행중인 컨테이너 불가)
docker rm [container]

- 컨테이너 강제 종료 후 삭제 (SIGKILL 시그널 전달)
docker rm -f [container]

- 컨테이너 실행 종료 후 자동 삭제
docker run —rm

Apache, PHP 스택 컨테이너 생성하기

mkdir apache-php && cd apache-php

vi index.php
<?php phpinfo(); ?>

vi Dockerfile
FROM ubuntu:20.04
ENV DEBIAN_FRONTEND=noninteractive
RUN apt update &&
apt install apache2 php libapache2-mod-php -y
COPY index.php /var/www/html
EXPOSE 80
CMD ["apachectl", "-D", "FOREGROUND"]

docker build -t apache-php .
docker run --name webserver -d -p 80:80 apache-php
다음의 조건으로 appjs:latest 컨테이너를 빌드하시오.
  • 빌드 디렉터리: ~/app_build/appjs
  • /data/ckad/app.js의 파일을 ~/app_build/appjs로 이동한 후 다음 조건에 맞게 컨테이너를 빌드하세요.
    • base image: node:12
    • app.js 파일을 컨테이너 / 디렉토리로 복사
    • 컨테이너 실행 시 node app.js가 동작되어야 한다.
  • 빌드한 컨테이너를 실행하시오.
cd ~/app_build/appjs
mv /data/ckad/app.js .

vi Dockerfile
FROM node:12
COPY app.js /
CMD ["node", "app.js"]
# ENTRYPOINT ["node", "app.js"]

# latest는 생략 가능
docker build -t appjs:latest .

# 빌드한 이미지 확인
docker images

# 컨테이너 생성
docker run -p 8080:8080 --name appjs -d appjs

curl localhost:8080