# Docker 설치

 

# Dockerfile 작성하기

@ Dockerfile 만드는 순서

  1. 베이스 이미지를 명시하기(파일 스냅샷에 해당)
  2. 추가적으로 필요한 파일을 다운 받기 위한 몇가지 명령어를 명시
  3. 컨테이너 시작시 실행 될 명령어를 명시
  • FROM
    • 생성할 이미지의 베이스가 될 이미지를 뜻합니다. 
    • FROM 명령어는 Dockerfile을 작성할 때 반드시 한 번 이상 입력해야 합니다.
  • MAINTAINER
    • 이미지를 생성한 개발자 정보를 나타냅니다.
  • RUN
    • 이미지를 만들기 위해 컨테이너 내부에서 명령어를 실행합니다.
    • RUN 명령어에 ["/bin/bash", "echo hello" >> test.html"] 같이 입력하면 /bin/bash 셸을 이용해 'echo hello >> test2.html'을 실행한다는 뜻입니다.
  • ADD
    • 파일을 이미지에 추가합니다.
    • Dockerfile이 위치한 디렉터리에서 파일을 가져옵니다.
    • ADD <DockerFile 경로 기준 파일 상대경로> <컨테이너 내 폴더 경로>
    • ex) ADD test.html /var/www/html 이라면 Dockerfile과 같은 디렉토리에 있는 test.html 파일을 이미지 내부의 /var/www/html에 추가한다는 뜻입니다.
  • WORKDIR
    • 명령어를 실행할 디렉터리를 나타냅니다. 배시 쉘에서 cd 명령어를 입력하는 것과 같은 기능을 합니다. 즉, 컨테이너 내부에서 작동을 합니다.
  • EXPOSE
    • Dockerfile의 빌드로 생성된 이미지에서 노출할 포트를 설정합니다. 그러나 EXPOSE를 설정한 이미지로 컨테이너를 생성했다고 해서 반드시 이 포트가 호스트의 포트와 바인딩되는 것은 아니며, 단지 컨테이너의 80번 포트를 사용할 것임을 나타내는 것뿐입니다.
  • CMD
    • CMD는 컨테이너가 시작될 때마다 실행할 명령어를 설정하며, Dockerfile에서 한 번만 사용할 수 있습니다.
  • ADD, COPY
    • ADD와 COPY는 큰 차이점이 없는 것처럼 보입니다. 하지만 차이점이 존재합니다.
    • COPY는 로컬 디렉터리에서 읽어 들인 컨텍스트로부터 이미지에 파일을 복사하는 역할을 합니다.
    • ADD는 외부 URL 및 tar 파일에서도 파일을 추가할 수 있다는 점이 다릅니다.
    • ADD를 사용하는 것은 그다지 권장하지 않습니다.
  • ENTRYPOINT, CMD
    • ENTRYPOINT, CMD는 역할 자체는 비슷하지만 서로 다른 역할을 담당하는 명령어입니다.
    • 위의는 entrypoint를 사용하지 않은 경우입니다. 이 때는 /bin/bash에 접속한 것을 볼 수 있습니다.
    • 이번에는 entrypoint를 사용하였습니다. 이 때는 /bin/bash를 출력한 것을 볼 수 있습니다.
    • 즉 둘 다 컨테이너가 시작될 때 수행할 명령을 지정한다는 점에서 같지만, entrypoint는 커맨드를 인자로 받아 사용할 수 있는 스크립트의 역할을 할 수 있다는 점에서 다릅니다.
# 베이스 이미지는 ubuntu:18.04 를 사용
FROM ubuntu:18.04

# 이미지 생성한 개발자 정보
MAINTAINER sddev1002 <sddev1002@gmail.com>

# 명령어 실행(일반 텍스트)
RUN apt-get update
RUN apt-get install -y apache2 # Install Apache web server (Only 'yes')

# 로컬 파일 추가
ADD test.html /var/www/html

# 컨테이너 내 명령어 실행될 경로 지정
WORKDIR /var/www/html

# 명령어 실행(리스트 형태)
RUN ["/bin/bash", "-c", "echo hello >> test2.html"]

# 컨테이너를 80번 포트로 설정 (외부 노출)
EXPOSE 80

# apache 서버가 죽지 않고 백그라운드로 돌아가기 위해서 아래의 명령어 실행
# 컨테이너 생성 후, apachectl -D FOREGROUND 명령어가 실행됨
CMD ["apachectl", "-D", "FOREGROUND"]
# CMD apachectl -D FOREGROUND

# Dockerfile로 이미지 만들기

[dockerfile이 존재하는 경로에서]
docker build -t <이미지명> .
# dockerfile이 존재하는 폴더로 이동
docker build -t <이미지명> .
docker images # 생성된 이미지 목록 조회
  • 해당 Dockerfile이 있는 위치에서 위의 명령어를 입력하면 <이미지명> 이라는 이름의 Image가 생성된다.
  • .은 Dockerfile이 존재하는 현재 폴더 위치를 의미한다.
  • -t : tag의 약자로, 이미지에 대한 이름을 tag로 지정할 수 있다.

 

 

# 이미지로 컨테이너 생성 및 실행하기

docker run <이미지 이름>
docker run <이미지 이름>

docker run -d -p 8080:80 -e WORDPRESS_DB_HOST=host.docker.internal -e WORDPRESS_DB_NAME=wp -e WORDPRESS_DB_USER=wp -e WORDPRESS_DB_PASSWORD=wp wordpress

docker run --rm -p 5678:5678 hashicorp/http-echo -text="hello world"

docker run -d -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql mysql:5.7

docker run -it wjdrbs96/hello:latest

docker run -d -p 3306:3306 --name mysql -v /Users/choejeong-gyun/Documents/mysql:/var/lib/mysql mysql:5.7

 

  • -e : -e 옵션은 environment의 약자로, 컨테이너 내 환경변수를 설정합니다.
  • --rm: --rm 옵션은 컨테이너를 일회성으로 실행할 때 주로 쓰이는데요. 컨테이너가 종료될 때 컨테이너와 관련된 리소스(파일 시스템, 볼륨)까지 깨끗이 제거해줍니다.
  • -p: port 옵션을 통해서 나의 로컬 PC 포트와 컨테이너 포트를 매핑할 수 있습니다. 즉, 나의 Local PC 5678 port와 컨테이너 5678 port를 연결시키겠다는 뜻입니다. 
  • -d: detach 모드라고 해서 백그라운드로 컨테이너를 실행하게 만드는 명령어 입니다.
  • --name: --name 옵션을 사용해서 컨테이너에 이름을 부여해주면 해당 ID가 아닌 이름으로 컨테이너를 식별할 수 있습니다.
  • -v : -v 옵션은 Docker Volume을 사용하겠다는 뜻이고 :를 기준으로 왼쪽은 나의 로컬 PC에 존재하는 디렉토리, 오른쪽은 MySQL 컨테이너 데이터가 저장되는 디렉토리 입니다. 즉, 두 디렉토리를 서로 연결시키겠다는 뜻입니다.
    (MySQL 컨테이너 디렉토리가 나의 로컬 디렉토리를 참조하겠다는 뜻이기도 합니다.)
    Container가 제거되도, 로컬에 있는 디렉토리 파일은 유지됩니다.

@ 실행 과정

  1. 도커 클라이언트에 명령어 입력 후 도커 서버로 보냄
  2. 도커 서버에서 컨테이너를 위한 이미지가 이미 캐쉬가 되어 있는지 확인
  3. 없으면 도커 허브에서 다운 받아옴(Pulling) 있다면 이미 가지고 있는 이미지 컨테이너 생성

@ 컨테이너 생성 과정

  1. Docker 이미지에 있는 파일 스냅샷을 컨테이너 하드 디스크에 옮긴다.
  2. 이미지에 있는 시작 시 실행 될 명령어는 컨테이너 안에 명령어 실행하는 곳으로 옮겨진다.
  3. 이미지가 컨테이너를 생성하여 컨테이너가 실행된다.

# 실행 중인 컨테이너에 접속하기

docker exec -it <컨테이너명>
docker exec -it mysql mysql
  • exec 명령어는 run 명령어와 달리 실행중인 도커 컨테이너에 접속할 때 사용하며 컨테이너 안에 ssh server 등을 설치하지 않고 exec 명령어로 접속합니다.
  • -it : -i 옵션과 -t 옵션은 같이 쓰이는 경우가 매우 많은데요. 이 두 옵션은 컨테이너를 종료하지 않은체로, 터미널의 입력을 계속해서 컨테이너로 전달하기 위해서 사용합니다. 따라서, -it 옵션은 특히 컨테이너의 쉘(shell)이나 CLI 도구를 사용할 때 매우 유용하게 사용됩니다.​

 

# 현재 컨테이너 목록 조회하기

 

docker ps         # 실행 중인 컨테이너 보기
docker ps -a     # 모든 컨테이너 보기

# 현재 이미지 목록 조회하기

docker images
docker images   # 가지고 있는 이미지들 보기

 

# Docker Container 생명주기와 관련된 명령어 요약

docker run <이미지 이름>
docker stop <컨테이너 ID> 
docker kill <컨테이너 ID>
docker rm <컨테이너 이름> # 먼저 실행 중인 컨테이너가 중지 되어 있어야 함
docker rmi <이미지 아이디> # 이미지 삭제

 

# Docker Compose yml 작성하기

version: '2'
services:
  db:
    image: mysql:5.7 
    volumes:
      - ./mysql:/var/lib/mysql 
    restart: always 
    environment:
      MYSQL_ROOT_PASSWORD: wordpress
      MYSQL_DATABASE: wordpress 
      MYSQL_USER: wordpress 
      MYSQL_PASSWORD: wordpress
  wordpress:
    image: wordpress:latest
    volumes:
      - ./wp:/var/www/html 
    ports:
      - "8000:80" 
    restart: always 
    environment:
      WORDPRESS_DB_HOST: db:3306 
      WORDPRESS_DB_PASSWORD: wordpress
  • volume: 현재(로컬 또는 리눅스 서버 등)에 존재하는 디렉토리와 컨테이너 내부 디렉터리를 매핑시킵니다.
  • environment: 서비스 컨테이너 내부에서 사용할 환경변수를 지정합니다.
  • restart: 항상 재시작한다는 뜻입니다.
version: "3"
services:
  web:             # nginx 컨테이너 이름 (원하는 이름)
    image: nginx  
    ports:
      - 80:80
    volumes:
      - /etc/nginx/:/etc/nginx/    # Nginx 컨테이너 내부 /etc/nginx 디렉토리가 위에서 설치한 EC2 내부에 /etc/nginx 디렉토리를 참조함
  spring:         # Spring Boot 컨테이너 이름 (원하는 이름)
    build: .
    ports:
      - 8081:8080
    volumes:
      - ./:/root/
  • version: 도커 컴포즈의 버전
  • services: 이곳에 실행하려는 컨테이너들을 정의
  • image: 사용할 이미지 적기
  • build: 경로에 해당하는 Dockerfile 실행
  • ports: EC2 포트:컨테이너 포트 매핑
  • volumes: EC2 디렉토리와 컨테이너 디렉토리 매핑

# Docker Compose yml을 통해, Multi container 생성 및 실행시키기

[docker-compose.yml이 존재하는 경로에서]
docker-compose up
docker-compose up

docker-compose version

 

'[CDS] DevOps > Docker' 카테고리의 다른 글

Docker 명령어 핵심만 이해하기  (0) 2020.11.26
Docker 사용법  (0) 2020.11.24
[Docker] Docker 이론  (0) 2020.11.23
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기