하나의 서버를 여러 서버로 전환하는 물리적인 하드웨어의 추상화
컨테이너 기반의 오픈소스 가상화 플랫폼
도커 컨테이너를 생성하는데 사용되는 애플리케이션의 파일들과 설정을 모아둔 것
Dockerfile
이라는 파일로 이미지를 만듦실행중인 이미지의 인스턴스
애플리케이션의 종속성과 함께 프로그램 자체를 캡슐화하여 호스트 OS와 격리된 공간에서 프로세스를 동작시키는 기술
데몬 프로세스에 대한 이해😈
백그라운드에서 실행되면서 여러 작업을 처리하는 프로그램
d
를 붙임1
$ docker run alpine ls -l
total 48
drwxr-xr-x 2 root root 4096 Mar 2 16:20 bin
drwxr-xr-x 5 root root 360 Mar 18 09:47 dev
drwxr-xr-x 13 root root 4096 Mar 18 09:47 etc
drwxr-xr-x 2 root root 4096 Mar 2 16:20 home
drwxr-xr-x 5 root root 4096 Mar 2 16:20 lib
......
......
ls -l
) 실행👉 가상 머신을 켜고 명령어를 실행하고 다시 종료하는 과정에 비하면 엄청 빠르다!
컨테이너에서 발생한 데이터들을 저장할 외부 공간
Docker - Dockerfile 작성 / Build (이미지 제작)
Image-building best practices
도커 데몬이 이미지를 생성할 때 호출하는 명령어 목록을 담은 텍스트 파일
FROM
베이스 이미지RUN
빌드 타임에 실행할 명령어ENV
환경변수WORKDIR
작업을 실행할 경로COPY
복사할 파일과 복사할 경로VOLUME
컨테이너에 마운트할 볼륨 경로CMD
컨테이너를 실행하기 위해 필요한 명령어ENTRYPOINT
docker run
명령을 실행할 때 같이 인자로 전달되는 명령어 (컨테이너 자체를 executable로 사용할 때 필요)도커 컴포즈 기초 및 문법
Docker Compose와 버전별 특징
여러 개의 컨테이너를 하나로 묶어주는 도구
extends
키워드로 연결할 수 있음
- 어디서든 서비스가 생성될 수 있도록 애플리케이션의 환경을
Dockerfile
에 정의- 애플리케이션을 구성할 서비스들을
docker-compose.yml
파일에 정의docker-compose up
으로 실행
version
스키마 버전3.9
를 명시하고 있음services
: 애플리케이션을 구성할 서비스 목록 (컨테이너를 실행할 때 필요한 정보 명시)서비스 이름
(아래의 목록은 순서가 상관없음)build
빌드할 Dockerfile의 경로image
사용할 이미지command
컨테이너에서 수행할 명령어ports
포트 정의working_dir
작업할 경로container_name
컨테이너 이름volumes
마운트할 볼륨 (상대 경로 사용 가능)environment
환경변수networks
사용할 네트워크 정의volumes
: 미리 생성해두고 컨테이너에서 불러와서 사용할 볼륨볼륨 이름
(볼륨 이름만 명시하면 기본 옵션을 사용)driver
driver_opts
드라이버 옵션 설정, 리눅스의 mount
실행과 동일 (참고)networks
: 컨테이너 간 네트워크 설정 네트워크 이름
What is Common Gateway Interface (CGI)?
CGI와 FastCGI 알아보기
CGI, FastCGI, PHP-FPM 개념
Common Gateway Interface (공용 게이트웨이 인터페이스)
중간중간 스냅샷 찍어서 백업해두기! (참고)
su -
apt-get update
apt-get install -y curl
apt-get install -y git
apt-get install -y vim
apt-get install -y nscd
공유폴더 설정
mount -t vboxsf (공유 폴더 이름) /mnt/share
virtualBox에서 실행하니까 나는 오류들...
- Fatal error: Please read "Security" section of the manual to find out how to run mysqld as root!
👉 Dockerfile에서mysqld
를 실행하기 전에User mysql
설정- Warning: World-writable config file '[설정파일]' is ignored.: 파일에 대한 권한 설정
- /etc/hosts를 수정해도 브라우저가 도메인을 인식하지 못하는 오류: nscd 패키지로 dns 캐시 flush
- nginx 500 에러: nginx의 컨테이너에서 로그 확인
👉 권한 문제
👉/var/www/wordpress
의 권한을www-data
에게 주기
daemon off
설정으로 nginx를 PID 1로 만들고 포어그라운드에서 실행하도록 함CMD
로 실행되는 프로세스는 PID 1을 가짐-nodes
옵션-subj
옵션에 인자로 필요한 정보 전달ERR_CERT_INVALID
오류: openssl로 self-signed 인증서를 발급해서 위험하다고 판단이 됐다. 빈 공간 클릭하고 thisisunsafe
입력하면 넘어감CMD ["mysqld-safe"]
로 데몬 실행PID 1
을 가지도록 해줌docker run -it -p 3306:3306 --name mariadb mariadb bash
로 컨테이너를 실행해서 컨테이너에 접근할 수 있음mysqladmin -u root -p shutdown
/etc/mysql/mariadb.conf.d/
)wp --info
명령이 잘 실행되는지 확인--path
로 지정 가능error establishing a database connection
이것 때문에 며칠을 고생했는데 mariadb가 제대로 실행되기 전에 워드프레스가 연결을 시도하면서 그런 거였다. Dockerfile에서
wp core install
명령을 바로 실행하지 않고 따로 쉘 스크립트를 작성한 뒤 컨테이너가 만들어진 후CMD
로 실행하니까 해결됐다.
docker-compose run [서비스명] ping [서비스명]
으로 ping 날려서 연결이 잘 됐는지 확인docker-compose run nginx ping mariadb
사용자 정의 네트워크를 사용해야 하는 이유
기본적으로 default 네트워크가 생성되고 bridge 방식으로 연결되긴 함
- default 네트워크에서는 IP 주소로만 서로에게 접근이 가능하기 때문에 이름을 사용하려면 따로 네트워크를 정의
(아니면--link
옵션을 써야 하는데 섭젝에서 금지하기도 했고 레거시)- 컨테이너가 추가되면
--network
옵션을 쓰지 않는 이상 기본적으로 default 네트워크에 속하게 되는데, 이는 예기치 않은 문제를 일으킬 수 있으므로 사용자 지정 네트워크를 만드는 것이 안전- default 네트워크 설정을 변경하면 호스트의 iptables 자체가 변경되어야 하기 때문에 도커를 재시작해야 하므로 비효율적
--link
옵션 없이 도커 볼륨, 도커 컴포즈 변수 등을 통해 환경 변수 공유 가능
RUN
, COPY
, ADD
만 레이어를 생성함RUN
을 한 줄로COPY
나 ADD
는 파일의 변경사항까지 비교해서 캐싱하기 때문에 여러 줄로 분리해서 작성docker
# 이미지 목록 확인
docker images
# 컨테이너 생성 및 실행
docker run [이미지 이름] # 이미지를 가지고 컨테이너를 생성/실행
# 옵션
-it [이미지 이름] # 인터랙티브 쉘(interactive tty) 실행
-d # detached 모드로 실행 (현재 터미널에서 분리하여 실행)
--name [컨테이너 이름] # 컨테이너 이름 설정
-e [환경변수명]="[값]" # 컨테이너 환경변수 설정
-P # 컨테이너의 모든 포트를 호스트의 랜덤한 포트로 연결
-p [호스트포트]:[컨테이너포트] # 포트를 명시적으로 매핑
# 컨테이너 목록 확인
docker ps # 현재 실행중인 컨테이너 목록 확인
# 옵션
-a # 현재 실행중 + 실행됐던 컨테이너 목록 확인
# 컨테이너 콘솔 로그 확인
docker logs [컨테이너 id/이름]
# 실행중인 컨테이너 내부에서 명령 실행
docker exec [컨테이너 id/이름] [명령어]
# 컨테이너 실행 중단
docker stop [컨테이너 id/이름]
# 컨테이너 삭제
docker rm [컨테이너 id/이름]
# 옵션
-f # 실행중인 컨테이너 강제 삭제
# 컨테이너 포트 확인
docker port [컨테이너 id/이름]
# 이미지 빌드
docker build [경로]
# 옵션
-t [이미지 이름] # 이미지 이름 지정. [이미지 이름]:[태그 이름]을 통해 태그를 지정할 수도 있음
docker-compose
# 도커 컴포즈 실행
docker-compose up # 현재 디렉토리의 docker-compose.yml 파일을 참고하여 실행
# 옵션
-d # detached 모드 (백그라운드에서 실행)
--build # build하고 실행
# 도커 컴포즈 실행 종료
docker-compose down
# 옵션
--volumes # 데이터 볼륨까지 삭제
# 실행 중인 서비스 목록
docker-compose ps
# 로그 확인
docker-compose logs # 뒤에 특정 서비스명을 써서 해당 로그만 골라서 볼 수도 있음
# 옵션
-f # follows (실시간 출력 확인)
# 특정 서비스에서 명령어 실행
docker-compose run [서비스 이름] [명령어]
# 서비스 실행 중단
docker-compose stop
# 데이터베이스 목록 확인
show databases;
# 데이터베이스 선택
use [데이터베이스 이름];
# 테이블 목록 확인
show tables;
# 사용자 목록 확인
select * from mysql.user;
도커 한방에 정리 🐳 (모든 개발자들이 배워보고 싶어 하는 툴!) + 실습
Docker for Beginners
Get started with Docker Compose
Use Docker Compose
How To Install WordPress With Docker Compose