- Go언어로 작성된 리눅스 컨테이너를 기반으로하는 오픈소스 가상화 플랫폼
- VM처럼 가상화기술을 사용하여 독립된 환경에서 애플리케이션을 실행할 수 있는 컨테이너를 생성
- Docker file과 Docker Image를 활용해 컨테이너를 생성할 수 있음
- VM은 호스트OS에서 사용중인 PC자원중 일부를 격리시키고 해당 자원을 사용해 게스트 OS를 설치하여 호스트로부터 완전히 분리된 가상화 환경을 구축할 수 있음
- 컨테이너는 호스트OS에서 사용중인 프로세스를 격리시키고 어플리케이션 실행에 필요한 바이너리만 올린 뒤 가상화하여 사용하는것
- VM은 OS위에 다른 OS가 올라가기에 무겁고 느릴수밖에 없지만 완전히 독립된 환경을 제공하기 때문에 더 높은 보안 격리레벨을 지원하여 보안적은 측면에서 유리함, 또한 커널을 공유하지않아 멀티OS 환경을 구축할 수 있음
- 컨테이너는 호스트OS와 도커 엔진 위에서 동작하며 호스트OS와 커널을 공유하기때문에 성능의 효율이 좋지만 호스트OS의 커널을 공유하기때문에 멀티OS가 불가능함
FROM debian:buster RUN apt-get update -y RUN apt-get -y install php-fpm php-mysql curl dumb-init EXPOSE 9000 # PORTS 8000:9000 COPY ./tools/wordpress_setting.sh / COPY ./tools/wp-config.php / RUN chmod +x /wordpress_setting.sh ENTRYPOINT [ "/usr/bin/dumb-init", "--"] CMD [ "/wordpress_setting.sh" ]
- FROM: 기반이 되는 이미지 레이어로 <이미지이름>:<태그> 형식으로 작성함
- RUN: 도커 이미지가 생성되기 전에 실행할 명령어
- EXPOSE: 호스트 내부의 다른 컨테이너들만 액세스할 수 있도록 특정포트를 노출시키는것
- PORTS: 호스트 외부, 내부의 다른 호스트및 컨테이너가 액세스할 수 있도록 특정포트를 노출시키는것, 컨테이너 내부의 9000포트가 호스트의 8000포트로 매핑되게 됨
- COPY: 호스트OS에있는 특정 파일을 컨테이너 내부에 복사할 수 있음
- ENTRYPOINT: CMD 명령어와 비슷하지만 무조건 실행됨, 컨테이너가 생성되고 최초로 실행할 때 수행되는 명령어를 지정
- CMD: 이미지로부터 컨테이너를 생성하여 최초로 실행할 때 수행할 명령어, docker run 명령어를 수행할 때 변경이 가능함, ENTRYPOINT가 있다면 ENTRYPOINT이후의 인자로 전달됨
- 여러개의 docker 컨테이너로 이루어진 서비스를 구축및 실행하는 순서를 자동으로 하여 관리를 간단하게 해주는 기능
- docker-compose.yml같은 compose파일을 준비하고 커맨드를 한번 실행하는것으로 파일에 정의한 설정들을 사용해 모든 컨테이너 서비스를 시작, 정지, 삭제 할 수 있음
만약 docker-compose를 사용하지않는다면
네트워크 만들기
docker network create [network]
각 컨테이너를 네트워크에 연결
docker run -d --name [container] --network [network][이미지]
을 해주어야 한다
version: '3' services: nginx: build: context: ./requierments/nginx dockerfile: ./Dockerfile volumes: - wp:/var/www/html ports: - "443:443" networks: - intra depends_on: - wordpress env_file: - .env restart: always mariadb: build: context: ./requierments/mariadb dockerfile: ./Dockerfile networks: - intra volumes: - db:/var/lib/mysql env_file: - .env restart: always wordpress: build: context: ./requierments/wordpress dockerfile: ./Dockerfile depends_on: - mariadb volumes: - wp:/var/www/html networks: - intra env_file: - .env restart: always volumes: wp: driver: local driver_opts: type: none o: bind device: 'home/$user_name/data/wordpress' db: driver: local driver_opts: type: none o: bind device: 'home/$user_name/data/mariadb' networks: intra: driver: bridge
- services: 생성하고자 하는 컨테이너들을 컨테이너이름, 설정 순으로 나열
- context: 빌드명령을 실행할 경로
- dockerfile: 빌드를 실행할 파일
-expose: 같은 네트워크에서 접근시 사용할 포트- ports: 호스트에서:같은네트워크
- env_file: 환경변수가 저장되있는 파일
- volumes: 컨테이너에 마운트할 볼륨 경로
db:/var/lib/mysql은 volumes의 db를 /var/lib/mysql와 연결하는것- depends_on: 종속성 순서대로 실행될 수 있도록 설정
- driver: 볼륨에 사용할 볼륨 드라이버
- driver_opts: 볼륨 드라이버에 전달할 옵션 목록
- type: 사용할 볼륨 드라이버 유형
- device: 호스트 파일 시스템에서 사용할 경로
- o: 마운트 옵션
- docker-compose up
docker-compose.yml을 바탕으로 컨테이너들을 생성하기 시작
-d 옵션을 사용하면 컨테이너를 백그라운드에서 실행시킴
--build 옵션을 사용하면 컨테이너 시작시 dockerfile을 빌드함- docker-compose down
docker-compose.yml을 바탕으로 생성한 컨테이너나 이미지들을 정지시키고 일괄적으로 삭제해줌
--rmi all 옵션을 사용하면 모든 이미지를 삭제함
-v 옵션을 사용하면 데이터 볼륨을 삭제함- docker-compose ps
현재 작동중인 컨테이너의 목록들을 보여줌
-q옵션을 사용하면 컨테이너 ID만 출력- docker-compose stop
현재 작동중인 컨테이너들을 일괄적으로 정지함- docker-compose start
현재 정지된 컨테이너들을 일괄적으로 시작함- docker-compose restart
현재 작동중인 컨테이너들을 일괄적으로 재시작함
Docker를 사용하다보면 이미지 생성중 에러가 발생시 생기는 <none> 이미지, 컨테이너가 쌓이게 됨
- docker rm $(docker ps --filter status=exited -q)
- docker rmi $(docker images -f "dangling=true" -q)
두 명령어를 사용하면 <none> 이미지와 컨테이너를 삭제할 수 있음
https://tecoble.techcourse.co.kr/post/2021-08-14-docker/
https://khj93.tistory.com/entry/Docker-Docker-File-작성하기-명령어