Docker 개념
Docker 란?
다양한 종류의 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼이다. 하드웨어의 자원을 모두 가상화 하지 않고 프로세스들만을 격리시켜 빠르게 환경을 구축할 수 있다.
서비스 환경을 갖춘 뒤 그것을 Docker Image로 만들어 배포하고 컨테이너로 간단히 실행 가능하다.
하드웨어의 모든 자원을 복제하는 VM과는 용량과 속도 부분에서 많은 차이가 존재한다.
Docker에서 Image(이미지) 란?
어떠한 개발 환경을 구축하기 위해 필요한 라이브러리 및 패키지를 모아 하나의 파일로 만든 것
•
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 기초 명령어
Docker 버전 확인
docker version
Bash
복사
현재 사용자 docker 명령어 사용 허용
기본적으로 root 권한을 사용하여(sudo 명령어 사용) docker 명령어를 사용해야 한다.
하지만 매번 명령어 사용할 때 마다 sudo 를 입력하기 번거롭기 때문에 아래 명령어로 현재 로그인한 사용자의 docker 명령어 사용권한을 설정해준다.
아래 명령어 입력 후 재 접속을 해줘야 한다.
sudo usermod -aG docker $USER
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
복사
사용하지 않는 이미지를 전부 삭제
만약 아무 컨데이너에도 연결되어 있지 않은 이미지가 많을 경우, 아래 명령어로 한번에 삭제가 가능하다.
docker images 명령어로 사용하지 않는 이미지인지 잘 확인한 후 삭제하자.
# -f 옵션을 사용하면 삭제 수락을 물어보지 않는다.
docker image prune -af
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 / 이미지 이름 / 생성 시간등을 확인할 수 있다. [ 클릭 시 사진 확대 가능 ]
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
복사
ERROR 해결
도커를 사용하며 발생한 에러의 종류와 해결법을 작성한 글이다.
이미지를 구성하는 파일의 수정내용이 반영되지 않는 경우
docker-compose를 사용한 서비스에서 사용되는 파일들이 docker-compose down 후 다시 docker-compose up 을 해줘도 적용이 되지 않을 경우, 아래와 같이 재 빌드 해줘야한다.
왜냐하면, 기존 이미지의 캐시가 남아있기 때문에 새롭게 이미지를 빌드해주지 않으면 기존 파일 내용으로 이미지를 계속 사용하기 때문이다.
아래 방법으로 종료, 재 빌드, 재 시작을 한번에 해줘야한다.
docker-compose down && docker-compose build --no-cache && docker-compose up -d
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
복사
M1 애플 칩에서 명령어가 동작하지 않을 때
M1 애플 칩에서는 일부 이미지가 지원하지 않기 때문에, 추가적인 옵션을 설정해줘야 한다.
docker (pull|run) --platform=linux/amd64 ~~
Bash
복사
docker 이미지 실행 시, exec user process caused: exec format error 에러가 발생할 경우
다른 아키텍처에서 빌드된 이미지라서 실행 시 오류가 발생한다.
•
예시) 애플 M1맥에서 빌드한 이미지가 실행이 안되는 경우
이럴때는 docker build 시 —-platform Linux/AMD64 옵션을 사용하여 아키텍처를 지정해준다.
docker build --platform Linux/AMD64 -t ~~ .
Bash
복사
ubuntu apt-get update 문제
docker-compose 시 max depth exceeded 에러 발생 해결
dockerfile에서 빌드하면서, 사용 가능한 최대 레이어의 수는 125개이다. 이를 초과하면서 발생하는 문제인데...
이때는 아래 예시와 같이 사용하던 기본 이미지를 삭제후, 다시 받아와 사용하면 해결된다.
예시 (본인은 python 기본이미지를 사용한 서비스 빌드 시 문제가 발생했었다.)