코딩마을방범대
Docker 이미지 생성하기 본문
Docker에 대한 기본 상식과 기초 사용 방법은 아래 포스트를 참고!
실행 중인 컨테이너를 이미지로 만들기
현재 실행 중인 컨테이너를 그대로 백업하여 이미지로 만들고 싶다면 Commit을 이용하면 된다.
이전 포스트에서 설명했듯이 image를 배포하기 위해선 image에 image를 쌓아야된다.
따라서 이전 포스트를 참고해 실행시킬 이미지를 다운받고 그 안에 차곡차곡 쌓으면 된다.
명령어
$ docker commit [옵션] <컨테이너명> <레포지토리>:<생성할 태그>
옵션 | 인수 | 설명 |
-a (--author) | String | 작성자 |
-c (--change) | 파일 | 생성된 이미지에 설명서 적용 |
-m (--message) | String | 메시지 기입 |
-p (--pause) | boolean |
커밋 중 컨테이너 일시 중지(기본값 true)
|
예시) ubuntu + git + NodeJS & ubuntu + git + Python
만약 베이스로 우분투 컨테이너를 실행시키고 그 안에 git을 설치하고,
또 commit으로 백업하여 각각의 컨테이너에 NodeJS와 Python을 설치할 경우 아래와 같이 실행하면 된다.
1. ubuntu 이미지 다운로드
# ubuntu 이미지 다운로드
$ docker pull ubuntu
2. 우분투 이미지 실행
# my-ubuntu라는 컨테이너명으로 실행 (실행하자마자 bash 터미널에 연결 유지하기)
$ docker run -it --name my-ubuntu ubuntu bash
# 항상 재실행, 권한 추가부여, 백그라운드 실행 시
# 나의 경우 시작점을 /sbin/init 으로 지정할 경우 폴더를 찾지 못했다고 떠서 그냥 bash로 했다..
$ docker run -it -d --privileged=true --restart=always --name my-ubuntu ubuntu /sbin/init
만약 컨테이너 내에 systemctl 를 이용한 명령어를 실행할 경우 에러가 발생한다.
Docker는 기본적으로 컨테이너 내에서 systemctl를 사용하지 못하도록 설정해놨다고 한다.
run 할 때 --privileged=true 옵션을 줘도 막히는 부분이 있는 것 같다.
되도록이면 service를 이용하는 것을 권장한다.
systemctl start service_name service service_name start systemctl stop service_name service service_name stop systemctl restart service_name service service_name restart systemctl status service_name service service_name status systemctl enable service_name service service_name on systemctl disable service_name service service_name off
※ 혹시나 Docker 내에서 Docker를 사용하게 되는 경우 아래 사항을 주의!
1. run 시에 --privileged=true 옵션 추가
ex) docker run -it --privileged=true --name my-ubuntu ubuntu bash
2. 컨테이너 내에 docker 설치 후 systemctl enable docker, /etc/init.d/docker start 두 개의 명령어 실행
3. git 설치
# apt-get 갱신
$ apt-get update
# git 설치
$ apt-get install git
4. Commit으로 실행되어있는 컨테이너 이미지 복사
# 컨테이너 bash 연결 종료
$ exit
# docker commit <컨테이너명> <레포지토리>:<생성할 태그>
$ docker commit my-ubuntu dbkim:ubuntu-git
5. 2개의 컨테이너로 실행하여 각각 python, node.js 설치
# monadk:ubuntu-git 이미지를 nodejs라는 컨테이너명으로 실행
$ docker run -it --name nodejs dbkim:ubuntu-git bash
# bash터미널 - nodejs 설치
$ apt-get update && apt-get install nodejs
$ exit
# monadk:ubuntu-git 이미지를 python 컨테이너명으로 실행
$ docker run -it --name python dbkim:ubuntu-git bash
# bash터미널 - python 설치
$ apt-get update && apt-get install python
$ exit
6. 이미지 생성
$ docker commit nodejs dbkim:ubuntu-git-nodejs
$ docker commit python dbkim:ubuntu-git-python
Dockerfile & Build를 통해 이미지 만들기
Dockerfile을 이용해 Build 하는 것은 실행한 컨테이너를 백업시키는 것이 아닌 처음부터 생성하는 방법이다.
이 방법은 이미지를 실행시켜 쌓는 방법이 아닌, 파일에 명령어들을 기입하는 방식이다.
파일명은 Dockerfile로 약속되어 있으며, 이름을 다르게 할 경우 build 할 때 따로 옵션을 줘야한다.
예시)
1. Dockerfile 생성
$ vi Dockerfile
2. 설정 기입
FROM ubuntu # ubuntu 이미지를 기반으로 해서
RUN apt-get update && apt-get install -y git # apt-get update하고 git을 설치
설정 | 인수 | 설명 |
FROM | <IMAGE_NAME> | 커스텀 이미지의 기반이 되는 이미지 (이미지를 생성할 때 FROM에 설정한 이미지가 로컬에 있으면 바로 사용하고, 없으면 Docker Hub에서 받아옴) |
ENV | <KEY>=<VALUE> | 환경변수로 설정할 값, 동적으로도 가능 (동적 예제. ARG name # 변수명 ENV env_name $name # 키값은 자유, 값은 변수명으로 docker build --build-arg name=dbkim . # --build-arg 이후 값 전달) |
RUN | <COMMAND> | FROM으로 설정한 이미지에 포함된 /bin/sh 실행 파일을 사용하게 되며 /bin/sh 실행 파일이 없으면 사용할 수 없음 (RUN이 실행될 때마다 Layer가 생성되어 저장됨) |
WORKDIR | <PATH> | 해당 디렉터리가 없다면 만들고, 해당 디렉터리로 이동 (RUN cd를 통해 이동할 경우 RUN 명령어가 끝나면 다시 원래 위치로 이동하기 때문에 WORKDIR를 이용해야함) |
COPY | <Host의 복사할 파일 경로> <이미지에서 파일이 위치할 경로> |
호스트OS의 로컬 파일 또는 디렉토리를, 이미지(컨테이너) 내의 경로로 복사 |
USER | <USER NAME> | 작업 사용자 지정 |
EXPOSE | <PORT NUM> | 방화벽에서 몇 번 Port 를 열지 지정하는 것과 유사 예시) EXPOSE ["80","8080"] -> 80,8080번 Port를 연다 |
CMD | <COMMAND> | 컨테이너가 시작될 때 실행할 명령어 지정 (CMD는 Dockerfile에서 한 번만 사용할 수 있음, 보통 맨 밑줄에 기입) |
CMD에 쓴 명령어는 컨테이너 실행(run)시에 오버라이딩 될 수 있다.
docker run --name web-server web-server-build pwd 라는 명령어로 컨테이너가 실행될 때
pwd가 실행되도록 한다면, CMD에 설정된 커맨드 대신 pwd가 실행된다.
RUN과 CMD의 차이점
RUN uild가 되는 시점에 실행되는 명령어 실행 이미지에 반영 CMD Container가 실행되는 시점에 실행되는 명령어 실행 컨테이너에 반영
3. 빌드
만약 이미 빌드 했었던 Dockerfile을 수정 후 재빌드 할 경우 빌드 캐쉬 삭제가 필요하므로 아래 명령어 실행
$ docker builder prune
# docker build -t <레포지토리>:<태그> <Dockerfile이 위치하는 디렉터리>
$ docker build -t dbkim:ubuntu-git .
옵션 | 설명 |
-t (--tag) |
태그 이름 및 선택적으로 태그 (형식: "name:tag")
|
-q (--quiet) | 이력을 출력하지 않고 성공 시 image ID만 출력 |
-f (--file) | 도커파일의 이름 (Dockerfile말고 다른 이름으로 했을 경우) 예시) home/dbkim/ubuntu_docker_file |
Docker 이미지 tar 파일로 추출하기
위의 방법으로 이미지를 생성하였다면, 해당 이미지를 통해 tar 파일로 추출이 가능하다.
■ image를 tar 파일로 저장하기
$ sudo docker save -o <저장할 파일명.tar> <이미지명>:<태그명>
■ tar 파일을 image로 불러오기
$ sudo docker load -i 파일명.tar
옵션 | 설명 |
-i (--input) | STDIN(Standard Input, 표준 입력에서 데이터를 읽어옴) 대신 tar 아카이브 파일에서 읽기 |
-q (--quiet) | 상세 출력 제어 |
이미지와 commit 목록
1. 커밋된 이미지 확인하기
docker images
출력값 | 설명 |
REPOSITORY | 이미지의 이름 |
TAG | 이미지의 태그 (버전) |
IMAGE ID | 이미지의 고유 식별자 |
CREATED | 이미지가 생성된 날짜 |
SIZE | 이미지의 크기 |
2. 특정 이미지 정보 확인하기
docker inspect <image_id>
참고사이트
WSL 우분투 "System has not been booted with systemd as init system" 에러
'💡 백엔드 > 우분투' 카테고리의 다른 글
MobaXterm, vi 편집기 단축키 정리 (0) | 2023.09.11 |
---|---|
Docker 내에서 Docker 사용하기 (0) | 2023.09.07 |
우분투에서 Docker 사용하기 (0) | 2023.09.04 |
우분투에서 Apache를 이용해 WAS 연동하기 (0) | 2023.06.13 |
우분투 패키지 재설치 시 정상적으로 설치가 되지 않을 경우 (0) | 2023.06.12 |