계속 잊어버려서 작성하는 도커 사용 간단 정리
도커에서 사용하는 이미지의 이름 형식
[저장소 이름] / [이미지 이름] : 태그
ex) alicek106/ubuntu:14.04
컨테이너 생성
docker run -i -t ubuntu:14.04
docker run 명령어는 컨테이너를 생성하고 실행하는 역할을 한다.
-i -t 옵션은 컨테이너와 상호(interactive) 입출력을 가능하게 한다.
ubuntu:14.04 이미지가 로컬 도커엔진에 존재하지 않는다면 도커 중앙 이미지 저장소인 도커 허브에서 자동으로 이미지를 내려 받게된다. 태그 미지정 시, latest 한 것으로 내려받음.
docker images
를 입력하면 도커 엔진에 존재하는 이미지의 목록을 출력한다.
컨테이너 생성 시에는 run 이 아니라 create 명령어를 사용할 수도 있다.
docker create -i -t --name mycentos centos:7
이 명령어는 컨테이너 내부에 들어가지는 않는다. 생성만 할 뿐이다. docker start
와 docker attach
명령어를 이용해야 컨테이너를 시작하고 내부로 들어가게 된다.
docker start mycentos
-> docker attach mycentos
run 명령어: docker pull
(이미지가 없을 때) -> docker create
-> docker start
-> docker attach
create 명령어: docker pull
(이미지가 없을 때) -> docker create
컨테이너 목록 확인
docker ps
: 정지되지 않은 컨테이너만 출력
docker ps -a
: 정지된 컨테이너를 포함한 모든 컨테이너를 출력
docker ps
입력 시에 COMMAND 탭의 정보는 컨테이너가 시작될 때 실행될 명령어다. 커맨드는 대부분의 이미지에 미리 내장되어 있기 때문에 별도로 설정할 필요는 없다. 가령 centos나 ubuntu의 경우 /bin/bash
라는 커맨드가 내장돼 있기 때문에 컨테이너를 생성할 때 별도의 커맨드를 설정하지 않는다. /bin/bash
명령어가 실행됐으므로 상호 입출력이 가능한 셸 환경을 사용할 수 있었던 것이다.
컨테이너 삭제
docker rm [CONTAINER_NAME]
: 컨테이너 삭제 명령
하지만 실행 중인 컨테이너는 삭제할 수 없다. 먼저 docker stop [CONTAINER_NAME]
을 하고 삭제해야 한다.
그러나 docker rm -f [CONTAINER_NAME]
와 같이 -f 옵션을 주면 삭제할 수 있다.
docker container prune
을 이용하면 모든 컨테이너를 삭제할 수 있다.
docker ps -a -q
는 -a로 모든 상태의 컨테이너를, -q 는 컨테이너의 ID만 출력 하는 옵션인데,docker stop $(docker ps -a -q)
-> docker stop $(docker ps -a -q)
를 이용해서 모든 컨테이너를 정지하고 삭제할 수 있다.
컨테이너를 외부에 노출
docker run -i -t --name mywebserver -p [호스트의 포트]:[컨테이너의 포트] ubuntu:14.04
와 같이 호스트의 포트와 컨테이너의 포트를 연결해줄 수 있다.
-d 옵션
-d: -i -t가 컨테이너 내부로 진입하도록 attach 가능한 상태로 설정한다면 -d는 Detached 모드로 컨테이너를 실행한다. Detached 모드는 컨테이너를 백그라운ㄴ드에서 동작하는 애플리케이션으로써 실행하도록 설정한다.
centos 같은 경우 -i -t 옵션으로 run 하면 배시 셸을 쓸 수 있게 설정이 된다.
-d 옵션으로 run을 실행하면 입출력이 없는 상태로 컨테이너를 실행한다. 컨테이너 내부에서 프로그램이 터미널을 차지하는 포그라운드(foreground)로 실행돼 사용자의 입력을 받지 않는다. Detached 모드인 컨테이너는 반드시 컨테이너에서 프로그램이 실행돼야 하며, 포그라운드 프로그램이 실행되지 않으면 컨테이너는 종료된다.
docker run -d --name detach_test ubuntu:14.04
와 같이 컨테이너 내부에서 프로그램을 실행하지 않은 채로 -d 옵션을 주게되면 컨테이너가 생성됐더라도 바로 종료된다.
반대로, docker run -i -t --name mysql_attach_test mysql:5.7
를 실행하게되면 상호 입출력이 불가능하고 단순히 프로그램이 포그라운드 모드로 동작하는 것만 지켜볼 수 있다. 이 같은 이유로 -d 옵션을 설정해 컨테이너가 백그라운드에서 동작하게 하는 것이다.
-d를 사용한 이상 attach 명령어로 컨테이너 내부로 들어가봤자 컨테이너에서 실행 중인 프로그램의 로그 출력을 보게될 뿐이다.
docker exec -i -t [container_name] /bin/bash
exec 명령어를 사용하면 컨테이너 내부에서 명령어를 실행한 뒤 그 결괏값을 반환받을 수 있다. 위의 명령어에서는 /bin/bash를 덧붙여 상호 입출력이 가능한 형태로 한 것이다.
도커 볼륨
도커 컨테이너가 삭제되어도 데이터를 보존하기 위해 도커 볼륨을 활용할 수 있다.
- 호스트와 볼륨을 공유하거나
- 볼륨 컨테이너를 활용하거나
- 도커가 관리하는 볼륨을 생성하거나
호스트와 볼륨을 공유하는 방법은 다음과 같다.
docker run -d \
--name wordpressdb_hostvolume \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_DATABASE=wordpress \
-v /home/wordpress_db:/var/lib/mysql \
mysql:5.7
이 경우에는 호스트의 /home/wordpress_db
디렉터리와 컨테이너의 /var/lib/mysql
디렉터리를 공유한다는 뜻이다.
해당 디렉터리가 호스트에 생성하지 않았어도 도커는 자동으로 이를 생성해준다.
만약 컨테이너의 디렉터리에 이미 다른 파일이 있는데 이렇게 볼륨을 연결해주는 경우 컨테이너의 디렉터리에 호스트의 디렉터리를 덮어 씌운다. 호스트의 디렉터리를 컨테이너의 디렉터리에 마운트한다는 것이다.
도커 이미지 생성
기존의 도커 컨테이너에서 변경사항을 만들고 이를 이미지로 만들고자 한다.
docker commit [OPTIONS] [CONTAINER_NAME] [REPOSITORY[:TAG]]
docker run -i -t --name commit_test ubuntu:14.04
docker commit \
-a "alicek106" -m "my first commit" \
commit_test \
commit_test:first
- -a : author
- -m : 커밋 메세지
docker images
로 확인해보면 commit_test:firrst 라는 이미지가 생성된 것을 확인할 수가 있다.
이제 이것을 도커 허브에다가 올릴 수 있다. docker login
명령어로 먼저 로그인을 하고 docker tag [IMAGE_NAME] [NEW_IMAGE_NAME]
을 해서 올리려는 저장소의 이름을 앞에다가 붙여야 한다. 나는 bepoz/commit_test:first
로 붙였다.
이후 docker push [IMAGE_NAME]
을 하면 도커 허브에 푸쉬된다.
Dockerfile
개발한 애플리케이션을 컨테이너화할 때 ubuntu, centos 등의 이미지로 컨테이너를 생성하고 애플리케이션을 위한 환경을 설치하고 코드를 복사해오고 이미지를 커밋한다. 이 과정이 너무 번거롭고 일일이 수작업이기 때문에 도커에서는 이를 손쉽게 수행할 수 있도록하는 빌드 명령어를 제공한다.
완성된 이미지를 생성하기 위해 컨테이너가 해야할 것들을 파일에 기록해 두면 도커는 이 파일을 읽어 컨테이너에서 작업을 수행한 뒤 이미지로 만들어 낸다. 이런 기록들이 되어있는 파일을 도커파일이라고 한다.
echo test >> test.html
vi Dockerfile
FROM ubuntu:14.04
MAINTAINER bepoz
LABEL "purpose"="practice"
RUN apt-get update
RUN apt-get install apache2 -y
ADD test.html /var/www/html
WORKDIR /var/www/html
RUN ["/bin/bash", "-c", "echo hello >> test2.html"]
EXPOSE 80
CMD apachectl -DFOREGROUND
- FROM : 생성할 이미지
- MAINTAINER : 이미지를 생성한 개발자의 정보 (도커 1.13.0 버전 이후로 사용 X)
- LABEL : 이미지에 추가할 메타데이터
- RUN : 컨테이너 내부에서 실행할 명령어
- ADD : 파일을 이미지에 추가한다. 파일은 Dockerfile이 위치한 디렉터리에서 가져온다. 위의 예시에서는 test.html을 /var/www/html 디렉터리에 추가하게된다.
- WORKDIR : 명령어를 실행할 디렉터리를 나타낸다. cd 명령어를 한 것과 같다.
- EXPOSE : 도커파일의 빌드로 생성된 이미지에서 노출할 포트를 설정한다. 컨테이너의 몇 번 포트를 사용할 것인지를 나타내는 것이다.
- CMD : 컨테이너가 시작될 때마다 실행할 명령어를 설정한다. 도커파일에서 한 번만 사용할 수 있고, 위에서는 컨테이너를 생성할 때 별도의 커맨드를 입력하지 않아도 apachectl -DFOREGROUND 로 인해 아파치 웹 서버가 실행될 것이다.
docker build -t [생성될 이미지의 이름] [도커파일이 저장되어있는 경로]
를 통해 도커파일을 빌드하여 이미지를 생성했다.
-t 옵션은 생성될 이미지의 이름을 정하는 것이다. 도커파일이 저장되어있는 경로가 현재 위치한 디렉터리면 그냥 ./
로 해주면 될 것이다.
생성 후 docker images --filter "label=purpose=practice"
와 같이 지정해준 LABEL 정보로 이미지를 필터링 할 수도 있다.
REFERENCE
시작하세요! 도커/쿠버네티스
'Infra' 카테고리의 다른 글
[ES] rollup 간략 정리 (1) | 2022.09.24 |
---|---|
[Redis] RedisTemplate, RedisCacheManager 설정에 대해 (2) | 2022.06.15 |
[Kubernetes] 쿠버네티스 개념 간략 정리 (2) | 2022.01.22 |
쿼리 튜닝 미션 적용기 (0) | 2021.10.13 |
[Flyway] 간략히 알아보는 Flyway 적용법 (0) | 2021.10.05 |