Search

Docker 정리

✅ 목차

🐬 Docker 개념

🐬 Docker 란?

다양한 종류의 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼이다. 하드웨어의 자원을 모두 가상화 하지 않고 프로세스들만을 격리시켜 빠르게 환경을 구축할 수 있다.
서비스 환경을 갖춘 뒤 그것을 Docker Image로 만들어 배포하고 컨테이너로 간단히 실행 가능하다.
💡
하드웨어의 모든 자원을 복제하는 VM과는 용량과 속도 부분에서 많은 차이가 존재한다.

🐬 Docker에서 Image(이미지) 란?

어떠한 개발 환경을 구축하기 위해 필요한 라이브러리 및 패키지를 모아 하나의 파일로 만든 것
Base Image : Docker Hub를 통해 배포된 각 Application의 공식 이미지
Docker Image : 사용자가 Base Image를 사용하여 그 위에 프로그램, 라이브러리, 소스를 설치한 뒤 하나의 파일로 만든 것

🐬 Docker에서 Container(컨테이너) 란?

이미지가 실행된 형태로써, 컨테이너 레벨에 저장되며 호스트와 이미지엔 아무런 영향을 주지 않고 Docker 엔진에서 독립적으로 실행된다.
비유
Base Image -> 글자 한개도 파지 않은 목판
Docker Image -> 책을 찍어내기 위해 글자를 파낸 목판
Container -> 목판을 사용하여 만든 책

🏗️ Docker 설치

🐧 Docker 설치 (Linux)

Command
curl -fsSL https://get.docker.com/ | sudo sh sudo apt-get install docker.io
Bash

🖥️ Docker 설치 (Window)

🍎 Docker 설치 (Mac)

👨‍💻 Docker 기초 명령어

⚠️ M1 애플 칩에서 명령어가 동작하지 않을 때

⚠️
M1 애플 칩에서는 일부 이미지가 지원하지 않기 때문에, 추가적인 옵션을 설정해줘야 한다.
docker (pull|run) --platform=linux/amd64 ~~
SQL

Docker 버전 확인

docker version
Bash

👨🏻‍💻 현재 사용자 docker 명령어 사용 허용

기본적으로 root 권한을 사용하여(sudo 명령어 사용) docker 명령어를 사용해야 한다.
하지만 매번 명령어 사용할 때 마다 sudo 를 입력하기 번거롭기 때문에 아래 명령어로 현재 로그인한 사용자의 docker 명령어 사용권한을 설정해준다.
💡
아래 명령어 입력 후 재 접속을 해줘야 한다.
sudo usermod -aG docker $USER
Bash

⚠️ docker 실행 시 권한 에러로 docker.sock에 대한 권한 에러 발생

아래와 같은 에러가 docker 명령어를 사용할 때 에러가 발생할때 경우이다.
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/create?name=jenkins_test: dial unix /var/run/docker.sock: connect: permission denied. See 'docker run --help'.
Plain Text
이 명령어로 docker.sock 의 권한을 다른 사용자도 사용할 수 있게 변경해준다.
sudo chmod 666 /var/run/docker.sock
Bash

🛠️ Docker 서비스 수동 시작 / 정지

# docker service start service docker start # docker service stop service docker stop
Bash

🐬 Docker Image 관련 명령어

⬇️ Docker Image 작성을 위한 Base Image 가져오기

💡
Docker 이미지 작성을 할때 사용되는 Dockerfile에 Base Image를 정의하는 것도 가능하다.
docker pull [imagename]:[tag] # centos 7 버전 Base Image 가져오기 docker pull centos:7 # ubuntu 18.04 버전 Base Image 가져오기 docker pull ubuntu:18.04
Bash

✔️ 현재 호스트에 존재하는 Image 확인

💡
Base Image, Docker Image 목록을 확인한다.
docker images
Bash

Image 삭제호스트에 존재하는 특정 이미지를 삭제한다.

💡
삭제하기 원하는 이미지를 사용하는 컨테이너는 미리 삭제해야 한다.
docker rmi [option] imagename [imagename... (여러 개 삭제 시) ]
Bash

👨🏻‍💻 사용중인 컨테이너를 이미지로 커밋하는법

기존에 사용하던 컨테이너가 추가적인 설정이 필요할 때(포트 매핑 등), 새롭게 컨테이너를 만들기엔 이전 백업본과 너무 다를 수 있다.
이때 주기적으로 백업을 위해 commit 명령어로 현재 사용중인 컨테이너를 이미지로 만들 수 있다.
docker commit [container_name] [new_image_name]
Bash

🐬 Docker Container 관련 명령어

🏗️ Container 생성하기

docker create [option] [imagename]:[tag] # ubuntu 18.04 컨테이너 생성 docker create -it ubuntu:18.04
Bash

🏃 Container 생성 후 자동 실행하기

💡
Command 미 작성 시, image를 생성하면서 사용된 Dockerfile에 정의된 Command를 실행 만약 Image 생성 시 Dockerfile에 아무런 기본 Command를 정의하지 않았다면 바로 종료 (실행되는 프로세스가 없기 때문)
docker run [option] [imagename]:[tag] [Command(선택)] # ubuntu 18.04 컨테이너 생성 후 실행 docker run -it ubuntu:18.04 /bin/bash
Bash

📁 Container와 호스트간 파일 복사하기

# Host -> Container docker cp [host_filepath] [container_name]:[container_filepath] # Container -> Host docker cp [continer_name]:[container_filepath] [host_filepath]
Bash

👨‍💻 docker run Option 정리

# -d : 백그라운드 모드로 실행 docker run -d ubuntu:18.04 ls # -p : 호스트와 컨테이너의 포트를 연결(포워딩) docker run -p 8080:3500 node:12.16.1 # -v : 호스트의 디렉토리와 컨테이너의 디렉토리를 연결 docker run -v [호스트]:[컨테이너] [image_name] docker run -v /home/docker/data:/app/data ubuntu:18.04 # -e : 컨테이너 내에서 사용할 환경변수 설정 (여러개 사용 시, -e옵션 여러번 사용) docker run -e [환경변수 이름]=[환경변수 값] docker run -e DATA=/app/data ubuntu:18.04 # --name : 컨테이너 이름 설정 docker run --name mydocker -it ubuntu:18.04 # --rm : 컨테이너의 프로세스 종료 시, 컨테이너를 자동으로 제거한다. docker run --rm ubuntu:18.04 # -it : 입출력을 가능하게 하고, tty를 활성화하여 bash 쉘을 사용 docker run -it ubuntu:18.04
Bash

✔️ Container 목록 확인

💡
정지된 컨테이너 목록까지 확인하고 싶은 경우 -a 옵션 추가
docker ps [옵션]
Bash

🤖 결과 예시

ID / 이미지 이름 / 생성 시간등을 확인할 수 있다. [ 클릭 시 사진 확대 가능 ]
속성 설명
Search
항목
설명
IMAGE
Open
컨테이너를 생성할 때 사용된 이미지 이름
COMMAND
Open
컨테이너가 시작될 때 실행될 명령어 (기본 /bin/bash)
CREATED
Open
컨테이너가 생성되고 난 뒤 시간
STATUS
Open
컨테이너 상태 UP(실행 중), Exited(종료), Pause(일시 중지)
PORTS
Open
컨테이너가 개방한 포트와 호스트에 연결한 포트
NAMES
Open
컨테이너의 고유한 이름, –name 옵션으로 지정 가능하며 지정하지 않으면 Docker 엔진이 임의로 설정

✔️ Container 사이즈 확인

docker ps --size | grep [container name]
Bash

✔️ Container log 확인

💡
컨테이너에서 발생되는 log를 확인할 수 있다. -f 옵션으로 실시간으로 생성되는 로그를 확인 가능하며, --tail 옵션으로 로그의 마지막 10줄만 확인가능하다.
docker logs [image name/image ID]
Bash

🏃‍♂️ Container 쉘 얻으며 동작 or 추가 명령어 실행

💡
exit 명령어 등으로 컨테이너를 중지하였을 때 다시 실행하거나, 동작 중인 Container에 추가적인 명령어를 사용하는 방법이다.
# 특정 컨테이너의 쉘을 얻으며 동작시킨다. docker exec -it [container name OR container ID] /bin/bash # 실행된 특정 컨테이너에 추가적인 명령어([command])를 동작시킨다. docker exec [container name / container ID] [command]
Bash

😎 Container를 root 권한으로 실행하는법

가끔 특정 이미지를 사용하여 Container를 만들었을 때, apt-get , rm시스템적으로 전혀 작업하지 못하도록 만든 Container가 존재한다.
이럴때는 exec 명령어로 쉘에 접속 시, -u 0 옵션으로 처음부터 root 권한으로 접속해야한다.
물론 이 명령어로 root 권한으로 접속한 다음, sudo 가 가능하도록 하면 되지만 크게 권장하지는 않는다.
docker exec -u 0 -it jenkins_test /bin/bash
Bash

🛑 Container 중지

💡
실행 중인 컨테이너를 중지한다.
docker stop [container name OR container ID]
Bash

Container 삭제

💡
컨테이너가 중지된 상태여야 한다.
# 컨테이너 이름 or ID로 중지 docker rm [container name OR container ID] # 컨테이너 강제 삭제 (-f 옵션 추가) docker rm -f [container name OR container ID] # 모든 컨테이너 삭제 docker container prune
Bash

👨‍💻 Container 관련 명령어의 정리된 이미지

🐬 Dockerfile을 사용하여 이미지 생성

Dockerfile 이란

사용자가 이미지를 생성하기 위해 명령 행에서 호출 가능한 모든 명령을 포함하는 텍스트 문서이다.
💡
Dockerfile와 baseimage를 사용하여 원하는 서비스로 자동화 빌드도 가능하다.

👨‍💻 Dockerfile에서 사용되는 기본적인 내용 정리

# base로 사용할 Image name을 설정 FROM [image name] # 이미지를 생성할 때 실행할 코드를 지정한다. RUN [command] # 작업 디렉토리를 설정하며 설정된 디렉토리 위치를 기준으로 명령어가 실행된다. # 만약 해당 디렉토리가 없을 경우 새로 생성한다. WORKDIR [dir] # 파일이나 폴더를 이미지에 복사한다. COPY [host file/dir path] [container file/dir path] # 이미지에서 사용할 환경 변수를 지정한다. ENV HELLO=hello # 컨테이너를 구동할 때 실행할 명령어를 지정한다. # ENTRYPOINT : 해당 이미지로 컨테이너 실행 시, 무조건 이 명령어를 실행 # CMD : 해당 이미지로 컨테이너 실행 시, 실행 명령어를 설정하지 않았을 때만 이 명령어 실행 ENTRYPOINT ["명령어","arg","arg2",...] CMD ["ls","arg","arg2",...]
Docker

🏗️ Dockerfile을 사용하여 이미지로 빌드하기

💡
작성한 Dockerfile을 사용하여 사용자만의 Docker Image로 빌드할 수 있다.
docker build [option] [Dockerfile path] # 현재 위치에 존재하는 Dockerfile을 사용하여 testimage 라는 이미지를 생성할 경우 # --tag로 이름과 태그를 설정할 수 있다. 만약 태그(1.0부분)를 설정하지 않을 경우 자동으로 'latest'로 설정된다. docker build --tag testimage:1.0 .
Bash
Docker image 내보내기
생성한 Docker Image를 다른 곳에서 사용할 수 있도록 내보낼 수 있다.
💡
-o 옵션을 사용하거나, ' > ' 를 사용하여 표준 출력으로 출력하는 것이 아닌 파일로 저장되도록 한다.
docker save -o [filename] [imagename]:[tag] docker save [imagename]:[tag] > [filename]
Bash
Docker image 가져오기
💡
파일로 저장한 Docker image 파일을 가져올 수 있다.
docker load < [filename]
Bash
새롭게 환경설정된 Container를 새로운 이미지로 만들기
이미지로 새로운 컨테이너를 만든 뒤, 사용자의 입맛대로 환경설정을 할 것이다.
이를 기존의 이미지를 수정하지 않고, 새로운 버전의 이미지로 생성이 가능하다.
💡
즉, base Image를 Dockerfile를 사용하여 처음부터 만드는것이 아닌 baseImage로 동작중인 컨테이너를 사용하여 환경설정을 해준 뒤, 새로운 버전의 이미지로 생성이 가능하다.
docker commit [options] [Container Name] [new Imagename]:[new tagname] # -a "" / --author="" : 생성자 정보 docker commit -a "Dongyeon" using_container image:2.0 # -m "" / --message="" : 이미지에 대한 메세지 docker commit -m "update server" using_container image:2.0 # -p / --pause=true/false : 이미지를 생성할 때 컨테이너를 중지한 뒤 commit 여부
Bash
나의 Docker Hub에 이미지 업로드 하기
우선 Docker Hub에 가입한 후, username을 확인한다. 필자는 testuser 이라고 작성하겠다.
먼저 docker login 명령어로 Docker Hub에 로그인 후 docker tag , docker push 명령어로 업로드 한다.
💡
만약 docker login 명령어로 정상적으로 로그인 했음에도 docker push 명령어 사용 후 denied: requested access to the resource is denied 와 같은 에러가 발생하는 경우가 있다. 그럴 땐 [username] 부분과 로그인한 ID가 동일한지 확인한다.
docker login -> ID 입력 -> PW 입력 Login Succeeded 출력 시 로그인 성공 docker tag [image_name]:[tag] [username]/[want_name]:[tag] docker push [username]/[want_name]:[tag] ex) docker tag myimage:1.0 testuser/myimageupload:1.0 docker push testuser/myimageupload:1.0
Bash

🐬 Dockerfile로 이미지 만들기 예시

Docker hub의 Ubunbu 18.04 Base이미지에는 python3가 설치되어 있지 않다.
그래서 Docker hub의 Ubunbu 18.04 Base이미지와 Dockerfile을 사용하여 python3가 설치된 Ubuntu 18.04 이미지를 만들어 보았다.

👨‍💻 Dockerfile 작성

# ubuntu 18.04 Base Image를 사용 FROM ubuntu:18.04 # apt-get으로 설치 시 에러 발생(lists lock 에러 등) 방지를 위해 레파지토리에 등록된 패키지 목록 제거 RUN rm -rf /var/lib/apt/lists/*# apt-get update 후, python3 , pip등을 설치 RUN apt-get update \ && apt-get install -y python3-pip python3-dev \ && cd /usr/local/bin \ && ln -s /usr/bin/python3 python \ && pip3 install --upgrade pip # python 설치 후, 추가적으로 python 모듈 설치를 원할 때 사용 # 아래 내용처럼 txt파일에 작성하거나, pip 명령어로 설치 # RUN pip install --trusted-host pypi.python.org -r requirements.txt
Docker

🏗️ 빌드

docker build --tag ubuntu_python:18.04 [Dockerfile 경로]
Bash

🐉 kali linux를 Docker로 구현하여 사용하기

칼리리눅스 공식 도커 컨테이너 확인
💡
이미지 이름을 kalilinux/kali-linux-docker 대신 kalilinux/kali 로 사용해야 함
# kali linux image 받아오기 docker pull kalilinux/kali # kali linux container 실행 docker run --name kali_linux --net="host" --privileged -e DISPLAY=$DISPLAY -it -v /tmp/.X11-unix:/tmp/.X11-unix kalilinux/kali /bin/bash # 패키지 업데이트 (in kali container) apt-get update && apt-cache search kali-linux # 기본 도구 설치 (in kali container) apt-get install kali-linux-default -y
Bash

🏗️ docker compose 파일을 사용하여 컨테이너 실행

docker-compose.yml 파일 이란?

컨테이너 실행에 필요한 옵션을 미리 작성한 파일로, 컨테이너 간 실행 순서나 의존성도 관리할 수 있다.
⚠️
\t 문자를 인식하지 못하기 때문에 들여쓰기가 아닌 띄어쓰기를 사용해야 한다.

👨‍💻 docker-compose.yml 파일 기본적인 내용 정리

# 파일 규격의 버전으로 가급적 최신버전인 3.x 버전을 사용하는 것이 가장 좋습니다. version: '3' # 컨테이너의 이름을 정의합니다. services: myservice1: # 서비스에서 사용할 도커 이미지를 작성합니다. image: serviceimage1 # run의 --volume과 같은 것으로, 호스트와 컨테이너의 공간을 공유하기 위해 사용합니다. # 하지만 docker-compose 파일에서는 상대 경로를 사용할 수 있습니다. volumes: - /home/docker/data:/app/data # run의 -e와 같은 것으로, 환경변수 설정에 사용됩니다. environment: - HELLO=hello # run의 -p와 같은 것으로, 포트 포워딩 지정에 사용됩니다. ports: - "8080:3500" # 컨테이너 실행 시, 사용될 명령어를 적는 부분입니다. command: - ls -al ... myservice2: ...
YAML

👨‍💻 docker-compose로 실행

작성한 docker-compose.yml 파일을 사용하여 서비스를 실행한다.
💡
docker-compose.yml존재하는 위치에서 실행해야 한다.
docker-compose up [option] # -d : 서비스 실행 후 콘솔로 빠져나온다. (run의 -d와 같은 옵션) # --force-recreate: 컨테이너를 지우고 새로 만든다. # --build: 서비스 시작 전 이미지를 새로 만든다.
Bash

✔️ docker-compose로 서비스 확인

현재 환경에서 실행 중인 각 서비스의 상태를 보여 준다.
docker-compose ps
Bash

🛑 docker-compose로 서비스 중단 / 재시작

현재 실행되고 있는 서비스를 중단하거나, 중단된 서비스를 재시작 한다.
# 실행중인 서비스 중단 dockek-compose stop # 중단된 서비스 다시 시작 docker-compose start
Bash

docker-compose로 서비스 삭제

docker-compose를 이용하여 서비스를 삭제한다.
💡
컨테이너와 네트워크를 삭제하며 --volume 옵션을 사용하여 볼륨도 삭제 가능하다.
docker-compose down [option]
Bash

👨‍💻 docker-compose 명령어를 사용하여 실행 예시

backend 서비스를 run으로 실행하지 않고 docker-compose로 실행

⌨️ 기존의 run 명령어

docker run -d -p 6789:3500 -v /home/nxtrm/crawling/data:/usr/src/app/data malware_trend/backend
Bash

✍️ docker-compose.yml 작성

version: 3 services: backend_container: image: malware_trend/backend volumes: - /home/nxtrm/crawling/data:/usr/src/app/data ports: - "6789:3500"
YAML

🏃 실행

docker-compose up -d
Bash

📄 출처

🐬 Docker Docs

✍️ 기초 / 이론

👨‍💻 Docker 설치 법과 간단한 사용법

🏗️ Docker 이미지 생성 / Docker-compose 사용법

⚠️ ERROR 해결

TOP