Dockerfile
이미지를 만들기 위한 설계도
(backend, frontend, DB 마다 하나씩 위치)
RUN 과 CMD 명령어의 차이
RUN : 이미지 생성 과정에서 명령 수행
CMD : 컨테이너가 만들어져 실행될 때 명령 수행
docker run -it code
이미지 다운 과정
Unable to find image 'node:latest' locally
-it
옵션 : 컨테이너를 열고 CLI를 실행시킵니다.# 다운 받은 Docker 이미지 목록
docker images
Docker 설치
# https 프로토콜 지원 패키지 설치
sudo apt install apt-transport-https ca-certificates \
curl software-properties-common
# https 암호화 통신을 위한 Docker Repository GPG 키 추가
## OK가 출력되면 설정 성공
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# Docker Repository 등록
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
# 패키지 정보 업데이트
sudo apt update
# Docker 설치
sudo apt install docker-ce
# Docker 실행 확인 (:q로 빠져나오기)
sudo systemctl status docker
# Docker 버전 확인
docker -v
# 현재 사용자를 Docker 그룹에 추가
## 추가 후 sudo 없이 Docker 명령어를 쓸 수 있습니다.
sudo usermod -aG docker ${USER} # ec2 재접속 후 적용
# 현재 사용자가 속한 그룹 출력
id -nG # docker 포함 여부 확인
Docker Compose 설치
sudo curl -L "https://github.com/docker/compose/releases/download/v2.3.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 실행 권한 추가
sudo chmod +x /usr/local/bin/docker-compose
# 버전 확인
docker-compose -v
[httpd 사용법] 도커에서 아파치 웹 서버 실행하기, 에움길
# Docker 로그인
docker login 아이디 비밀번호
# Docker 로그아웃
docker logout
# Docker 컨테이너의 파일을 호스트 PC로 복사
docker cp 이미지명:컨테이너_파일 호스트PC_경로
# Docker 컨테이너 수정 후 이미지 생성
docker commit 옵션 컨테이너명 이미지명[:태그]
# Docker 이미지 검색
docker search 이미지명:태그
## 검색 결과 개수 제한
docker search --limit=개수 이미지명:태그
## 최신 버전의 이미지 다운로드
docker search 이미지명:latest
# Docker 이미지 내려 받기
## 태그 생략 시 가장 최근 버전 (latest) 을 내려 받음
docker pull [옵션] 이미지명[:태그명]
# 설치된 Docker 이미지 목록
docker image ls
## 이미지 ID만 출력하는 옵션
docker image ls -q
# 이미지 삭제
docker rmi 이미지ID
# rm도 rmi와 동일
docker image rm 이미지ID
# Docker 이미지 생성 과정 확인
docker history 이미지명
# 컨테이너 생성
docker create ubuntu
# 실행 중인 컨테이너 출력
docker ps
## 모든 컨테이너 출력
docker ps -a
## 컨테이너 아이디만 출력
docker ps -q
컨테이너의 4가지 상태 (STATUS)
# 컨테이너 삭제
docker rm 컨테이너ID
# 컨테이너 이름 변경
docker renamee 원래이름 변경할이름
# 컨테이너 실행
docker start 컨테이너이름(또는 컨테이너ID)
# Docker 컨테이너 내에서 명령어 실행
docker exec -it 컨테이너명 실행할-명령어
docker run
옵션 | 축약형 | 설명 |
---|---|---|
--interactive | -i | 컨테이너 표준입력 활성화 |
--tty | -t | bash를 사용할 수 있도록 가상 터미널(tty) 할당 |
--detach | -d | 데몬 모드, background에서 컨테이너 실행 |
--publish | -p | 호스트와 컨테이너 포트 연결 (port-forwarding) |
--volume | -v | 데이터 볼륨 설정 |
--user | -u | 사용자 계정명 또는 UID 설정 |
--env | -e | 컨테이너의 환경 변수 설정 |
--name | 컨테이너 이름 설정 | |
--rm | 프로세스 종료 시 컨테이너 자동 삭제 | |
--restart | 컨테이너 재시작 옵션 설정 | |
--privileged | 컨테이너 안에서 호스트의 주요 자원 접근 허용 (커널 등) |
# 컨테이너 실행 시 컨테이너 이름 변경
docker run --name -it 변경될이름 기존이름
# 컨테이너 생성 후 종료 시 컨테이너 삭제
docker run -it --rm --name 생성될이름 기존이름
# 백그라운드에서 실행
# 컨테이너 종료
docker stop 컨테이너명
# 이미지 다운 받고 실행
docker run 이미지명
# 컨테이너 옵션을 적용해 실행
docker run --name 컨테이너명 &&^
-v $(pwd):/컨테이너와-공유할-폴더-경로 &&^
-p 로컬-포트번호:컨테이너-포트번호 Docker-이미지명
# Dockerfile 빌드
docker build 도커파일명 경로
## 이미지 이름 지정
docker build --tag 이미지명:태그명 저장경로
## 파일명이 Dockerfile이 아닌 경우
docker build -f 다른_도커파일명 경로
## 빌드 전 이미지 최신 버전을 다운 받은 후 빌드하는 옵션
docker build --path==true Dockerfile .
# 베이스 이미지를 강제로 새로 받아옴
docker image build --pull=true 경로
# 컨테이너 중지
docker stop $(docker ps -a -q)
## sudo 사용 시
sudo docker stop $(sudo docker ps -a -q)
# 컨테이너 삭제
docker rm $(docker ps -a -q)
## sudo 사용 시
sudo docker rm $(sudo docker ps -a -q)
# 이미지 삭제
docker rmi -f $(docker images -q)
## sudo 사용 시
sudo docker rmi -f $(sudo docker images -q)
Dockerfile은 어디에 쓰이나요?
커스텀된 Docker 이미지를 만들 때 사용됩니다.
서비스를 배포할 때도 활용됩니다.
Dockerfile 작성 시 주의해야할 점은?
# 주석
명령어 인자값
꼭 알아야할 Docker 명령어에는 어떤 것들이 있나요?
Dockerfile에서 자주 쓰이는 명령어, <DaleSeo/>
명령어 | 설명 |
---|---|
FROM | base 이미지 지정 |
WORKDIR | 작업 디렉토리 전환 |
RUN | 쉘(Shell) 명령어 실행 |
ENTRYPOINT | Docker 컨테이너 시작 시 실행할 쉘 명령어 지정, 변경 불가 ex: ENTRYPOINT ["npm", "start"] |
CMD | Docker 컨테이너 시작 시 실행할 쉘 명령어 지정, 변경 가능 Dockerfile당 하나만 |
EXPOSE | Docker 컨테이너 외부로부터의 접근을 허용할 Port와 Protocol 지정 |
ENV | 환경변수 설정, 런타임 |
ARG | --build-arg 로 전달할 인자 지정, 빌드 시점 |
COPY | 파일, 디렉토리를 Docker 컨테이너에 복사 |
ADD | COPY와 비슷, 압축 파일 등 특수한 케이스에서만 COPY 대신 사용 |
USER | 사용자를 지정 (RUN, CMD, ENTRYPOINT와 함께 사용) USER user[:group] |
LABEL | 이미지의 상세 정보를 기록 (title, version, maintainer, description 등) |
Docker Compose란?
여러 개의 Docker 컨테이너를 한 번에 관리할 때 쓰는 툴입니다.
version: "3"
services:
mysql:
# container_name: mysql
image: mysql:5.7
restart: always
ports:
- "3306:3306"
env_file: .env
environment:
- MYSQL_DATABASE=데이터베이스명
- MYSQL_ROOT_PASSWORD=루트 계정 비밀번호
- TZ=Asia/Seoul
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
volumes:
- ./db/conf.d:/etc/mysql/conf.d
- ./deb/data:/var/lib/mysql
- ./db/initdb.d:/docker-entrypoint-initdb.d
version
services
image
restart
volumns
docker run -v
명령어와 같습니다.environment
ports
depends_on
links (depecated)
networks
# 모든 서비스(컨테이너)를 백그라운드(-d)에서 띄우기
docker-compose up -d
# 모든 컨테이너 삭제
docker-compose down