도커는 컨테이너 기반의 오픈소스 가상화 플랫폼이다.
다른 도구와 마찬가지로 어떤 문제를 해결하기 위해 만들어졌고 그 방법이 많은 사람들에게 인기를 끌면서 널리 사용되었다.
도커가 등장하고 서버관리/개발 방식이 컨테이너 방시으로 완전히 바뀌게 된다.
도커가 등장하고 나서 어떠한 프로그램도 컨테이너로 만들 수 있고 어디서든 컨테이너를 실행할 수 있다.
그럼 도커는 가상머신 같은거일까?
도커는 가상머신처럼 독립적으로 실행되지만 가상머신보다 빠르고 쉽고 효율적이다.
도커의 특징
확장성/이식성
- 도커가 설치되어 있다면 어디서든 컨테이너를 실행할 수 있음
- 특정 회사나 서비스에 종속적이지 않음
- 쉽게 개발서버를 만들 수 있고 테스트서버 생성도 간편함
표준성
- 도커를 사용하지 않는 경우 ruby, nodejs, go, php 로 만든 서비스들의 배포 방식은 제각각 다름
- 컨테이너라는 표준으로 서버를 배포하므로 모든 서비스들의 배포과정이 동일해짐
이미지
- 이미지에서 컨테이너를 생성하기 떄문에 반드시 이미지를 만드는 과정이 필요
- Dockerfile을 이용하여 이미지를 만들고 처음부터 재현 가능
- 빌드 서버에서 이미지를 만들면 해당 이미지를 이미지 저장소에 저장하고 운영서버에서 이미지 불러옴
설정관리
- 설정은 보통 환경변수로 제어함
- MYSQL_PASS=password와 같이 컨테이너를 띄울때 환경변수를 같이 지정
- 하나의 이미지가 환경변수에 따라 동적으로 설정파일을 생성하도록 만들어져야함
자원관리
- 컨테이너는 삭제 후 새로 만들면 모든 데이터가 초기화됨
- 업로드 파일을 외부 스토리지와 링크하여 사용하거나 S3같은 별도의 저장소가 필요
- 세션이나 캐시를 memcached나 redis와 같은 외부로 분리
결국 도커가 가져온 변화가 무엇일까.
- 클라우드 이미지보다 관리하기 쉬움
- 다른 프로세스와 격리되어 가상머신처럼 사용하지만 성능저하 거의 없음
- 복잡한 기술을 몰라도 사용할 수 있음
- 이미지 빌드 기록이 남음
- 코드와 설정으로 관리 > 재현 및 수정 가능
- 오픈소스 > 특정 회사 기술에 종속적이지 않음
도커 설치
https://docs.docker.com/desktop/install/mac-install/
도커 설치 확인
docker version
도커 명령어
실행중인 컨테이너 조회
docker ps //실행중인 컨테이너 조회
docker ps -a // 중지되어있던 컨테이너도 조회
-d : 백그라운드 모드
-p : 호스트와 컨테이너의 포트를 연결
-v : 호스트와 컨테이너의 디렉토리를 연결
-e : 컨테이너 내에서 사용할 환경변수 설정
--name : 컨테이너 이름 설정
--rm : 프로세스 종료시 컨테이너 자동 제거
-it : -i와 -t를 동시에 사용한 것으로 터미널 입력을 위한 옵션
--network : 네트워크 연결
run - 컨테이너 실행
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
stop 명령어 - 컨테이너 중지
docker stop [OPTIONS] CONTAINER [CONTAINER...]
rm 명령어 - 종료된 컨테이너를 완전히 제거
docker rm [OPTIONS] CONTAINER [CONTAINER...]
logs 명령어
docker logs [OPTIONS] CONTAINER
ex) docker logs -f b892hfod
-f 옵션은 실시간 로그 확인 옵션
images 명령어 - 도커가 다운로드한 이미지 목록 조회
docker images [OPTIONS] [REPOSITORY[:TAG]]
pull 명령어 - 이미지를 다운로드하는 명령어
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
ex) docker pull ubuntu:18.04
이미지 삭제 명령어
docker rmi [OPTIONS] IMAGE [IMAGE...]
images 명령어를 통해 얻는 이미지 목록에서 이미지 ID를 입력하면 삭제 됨
단,컨테이너가 실행중인 이미지는 삭제되지 않는다.
network create 명령어 - 도커 컨테이너끼리 이름으로 통신할 수 있는 가상 네트워크를 만듦
docker network create [OPTIONS] NETWORK
ex) docker network create app-network
app-network 라는 이름으로 wordpress와 mysql이 통신할 네트워크를 만듦
network connect 명령어 - 기존에 생성된 컨테이너에 네트워크를 추가
docker network connect [OPTIONS] NETWORK CONTAINER
ex) docker network connect app-network mysql
mysql 컨테이너에 네트워크를 추가한다.
network option 명령어
docker run -d -p 8080:80 \
--network=app-network \
-e WORDPRESS_DB_HOST=mysql \
-e WORDPRESS_DB_NAME=wp \
-e WORDPRESS_DB_USER=wp \
-e WORDPRESS_DB_PASSWORD=wp \
wordpress
워드프레스를 app-network에 속하게 하고 mysql을 이름으로 접근
volume mount (-v) 명령어
docker stop mysql
docker rm mysql
docker run -d -p 3306:3306 \
-e MYSQL_ALLOW_EMPTY_PASSWORD=true \
--network=app-network \
--name mysql \
-v /Users/subicura/Workspace/github.com/subicura/docker-guide/ch02/mysql:/var/lib/mysql \
mariadb:10.9
wordpress를 띄운 상태에서 mysql을 삭제후에 다시 실행하면 데이터베이스 오류가 발생
컨테이너가 삭제될때 데이터가 다 삭제되어서 오류생김
-v /my/own/datadir:/var/lib/mysql
내 디렉토리랑 mysql 디렉토리랑 연결해주는 명령어
docker-compose
docker-compose.yml
version: '2'
services:
db:
image: arm64v8/mysql:8.0
volumes:
- ./mysql:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: wordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
image: wordpress:latest
volumes:
- ./wp:/var/www/html
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_PASSWORD: wordpress
docker-compose up //docker compose를 이용하여 mysql과 wordpress를 실행
docker-compose down //docker compose를 이용하여 mysql과 wordpress를 종료
'WEB' 카테고리의 다른 글
[WEB] HttpServletRequest / ServletRequest (0) | 2024.10.28 |
---|---|
[Spring boot] h2 연결하기 (0) | 2024.10.28 |
HTTP header - referer (0) | 2023.04.23 |
[WEB] Spring 한글 깨짐 방지 (0) | 2022.07.19 |
[Window] 원격 데스크톱 연결하기 (0) | 2022.07.18 |