도커 이미지만 있다면, 도커 데몬이 설치된 컴퓨터에서 도커 프로세스 실행 가능.
docker run <IMAGE>:<TAG> [<args>]
<IMAGE>
: 실행시키는 이미지 주소, 레지스트리 이름/이미지 이름, 레지스트리 이름의 기본은 docker.io<TAG>
: 기본은 latest<args>
: 컨테이너에 전달할 인수
아래의 두 명령어는 똑같은 명령어다. 인자로 cosway, 'heloo world!'를 넘겨준다.'
docker run docker/whalesay cowsay 'hello world!'
docker run docker.io/docker/whalesay:latest cowsay hello world!'
-d 옵션으로 컨테이너를 백그라운드에서 실행한다.
docker run -d nginx
docker ps
: 실행중인 컨테이너 조회
docker ps -a
: -a(all)옵션으로 종료된 컨테이너까지 조회
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bc14088d2b60 nginx "/docker-entrypoint.…" 8 minutes ago Up 8 minutes 80/tcp flamboyant_prosk~
docker inspect <CONTAINER ID>
[
{
"Id": "bc14088d2b60053fab1828b07e97990d5167a8a39fa4e8f7d77c3c16aade755b",
"Created": "2023-06-24T15:44:15.9810891Z",
"Path": "/docker-entrypoint.sh",
"Args": [
"nginx",
"-g",
"daemon off;"
],
"State": {
"Status": "running",
"Running": true, ~
docker logs <CONTAINER ID>
: 컨테이너에서 출력되는 로그 기록 확인
docker logs -f <CONTAINER ID>
: -f 옵션으로 실시간 로그 출력 -> 멈추려면 ctrl + c
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
~
2023/06/24 15:44:17 [notice] 1#1: using the "epoll" event method
2023/06/24 15:44:17 [notice] 1#1: nginx/1.25.1
docker exec <CONTAINER_ID> <CMD>
: 실행된 컨테이너에, 명령 전달 (새로운 패키지 설치, 설정 수정 등)
docker exec bc14088d2b60 sh -c 'apt update && apt install -y wget'
docker exec bc14088d2b60 wget localhost
--2023-06-24 16:11:15-- http://localhost/
Resolving localhost (localhost)... 127.0.0.1, ::1
Connecting to localhost (localhost)|127.0.0.1|:80... connected.
docker cp <HOST_PATH> <CONTAINER_ID>:<CONTAINER_PATH>
docker cp /etc/passwd bc14088d2b60:/usr/share/nginx/html/.
docker exec bc14088d2b60 curl localhost/passwd
명령어로 확인 docker cp bc14088d2b60:/usr/share/nginx/html/index.html .
cat index.html
명령어로 복사된 파일 확인 가능docker stop <CONTAINER_ID>
docker ps
로 확인 불가, docker ps -a
사용docker run <CONTAINER_ID>
docker rm <CONTAINER_ID>
docker rm $(docker ps -aq) -f
: 모든 컨테이너 삭제!!
docker rm <CONTAINER_ID>
컨테이너 생성(run)과 동시에 컨테이너 접속하는 경우
docker run -it ubuntu:16.04 bash
=> root@dd40dc18bf0a:/#
로 쉘 연결됨!
=> 나가려면 exit
명령어 사용
이미 실행된 컨테이너로 접속하는 경우(exec 사용)
docker run -d nginx
docker exec -it 2b226f1a3386 bash
=> root@2b226f1a3386:/#
로 쉘 연결됨!
docker login
: 도커 허브에 로그인docker images
: 원격저장소에서 다운받아, 로컬에 저장된 이미지 확인
docker push <USENAME>/<NAME>
: 원격(도커 허브)으로 이미지 업로드
docker pull <IMAGE_NAME>
: 원격에 있는 이미지 다운로드
docker rmi <IMAGE_NAME>
: 로컬에 있는 이미지 삭제
이미지!! 에 이름을 바꾸는 거임. 실행 중인 컨테이너 이름 바뀌는게 아니라
docker tag nginx <USERNAME>/nginx
docker images
: 로 이미지 이름바뀐거 확인 가능
실습은 다음과 같이 진행했다.
docker tag docker/whalesay pipisebstian/whalesay
pipisebstian/whalesay latest 6b362a9f73eb 8 years ago 247MB
docker/whalesay latest 6b362a9f73eb 8 years ago 247MB
여길 보면, 기존의 whalesay가 있고, pipisebstian/whalesay 가 생겼다. 이미지 id는 동일하며, 이름만 다를 뿐 같은 이미지다! 왜 username으로 했냐면, 나중에 원격에 만든 이미지를 push할때, docker push <USENAME>/<NAME>
형식으로 해야하기 때문이다. 아니면 denied된다
이때까지, 이미 만들어진 이미지를 가지고 실습했다. 이반에는 직접 도커 파일을 작성해서, 도커 이미지를 만들어보자.
import os
import sys
my_ver = os.environ["my_ver"]
arg = sys.argv[1]
print(f"Hello {arg}, my version is {my_ver}!")
FROM ubuntu:18.04
RUN apt-get update \
&& apt-get install -y \
curl \
python3-dev
WORKDIR /root
COPY hello.py .
ENV my_ver 1.0
CMD ["python3", "hello.py", "pipisebastian"]
FROM
: 기반 이미지(base image), 해당 이미지를 기반으로 도커 이미지가 생성됨.
(뒤에서 설명)ARG
: DockerFile 안에서 사용할 수 있는 매개변수 정의
RUN
: 지정한 명령 실행
WORKDIR
: 이미지의 작업 폴더(work directory) 지정
COPY
: 로컬 호스트에 존재하는 파일을 이미지 안으로 복사
ENV
: 이미지의 환경변수 지정
CMD
: 이미지 실행시, default로 실행되는 명령 지정.
(뒤에서 설명)ENTRYPOINT
: CMD와 유사하게 명령을 실행하나, override 되지 않는 특징이 있다
docker build <PATH> -t <IMAGE_NAME>/<TAG>
docker build . -t hello:1
현재 directory에 위치한 Dockerfile을 가지고 hello 이미지를 생성한다. docker images
명령어로 생성된 이미지 확인한다.
REPOSITORY TAG IMAGE ID CREATED SIZE
hello 1 88fc6cdbf9cc 34 seconds ago 261MB
docker images
명령어로 생성된 이미지 확인
docker run hello:1
=> Hello pipisebastian, my version is 1.0! 출력
docker run hello:1 echo "hahah"
=> hahah 출력 <= 파라미터를 넣으면, 기존 CMD가 오버라이드됨
오버라이드 되는 걸 막기위해, Dockerfile을 다음과 같이 CMD -> ENTRYPOINT로 변경함.
FROM ubuntu:18.04
RUN apt-get update \
&& apt-get install -y \
curl \
python3-dev
WORKDIR /root
COPY hello.py .
ENV my_ver 1.0
ENTRYPOINT ["python3", "hello.py", "pipisebastian"]
docker run hello:1 echo "hahah"
=> Hello pipisebastian, my version is 1.0! 출력
ENTRYPOINT
는 파라미터로 명령을 전달하더라도, override되지 않음. 대신 파라미터 전달 값이 ENTRYPOINT
의 파라미터로 그대로 들어감. 무슨 말이냐!
FROM ubuntu:18.04
RUN apt-get update \
&& apt-get install -y \
curl \
python3-dev
WORKDIR /root
COPY hello.py .
ENV my_ver 1.0
ENTRYPOINT ["python3", "hello.py"] // 3번째 인수 제거
docker build . -t hello:2
docker run hello:2 pipipipip
=> Hello pipipipip, my version is 1.0! 출력
+) 그러나, 강제로 override하는 방법도 있다 --entrypoint
컨테이너 실행할 때, 환경변수 주입이 가능하다. (-e 옵션)
docker run -e my_ver=1.5 hello:1
=> Hello pipisebastian, my version is 1.5! 출력
컨테이너 빌드할 때, 환경변수 주입을 해봅시다.
1. dockerfile 변경
FROM ubuntu:18.04
RUN apt-get update \
&& apt-get install -y \
curl \
python3-dev
ARG my_ver = 1.0 ## 추가
WORKDIR /root
COPY hello.py .
ENV my_ver $my_ver ## 수정
CMD ["python3", "hello.py", "pipisebastian"]
docker build . -t hello:2 --build-arg my_ver=2.0
=> Hello pipisebastian, my version is 2.0 출력
docker run -p 5000:80 -d nginx
: 호스트 서버의 5000번 포트를 컨테이너의 80번 포트와 매핑
=> "<내부 IP 또는 공인 IP>:5000"으로 웹페이지 접속
=> hostname -i
내부 IP 확인, curl ifconfig.co
공인 IP 확인
=> ex) 127.0.1.1:5000 으로 웹페이지 접속
컨테이너는 휘발성 프로세스기에, 컨테이너가 삭제되면 다 날라간다.
데이터를 지속적으로 보관하기 위해선, 볼륨을 사용한다.
=> 로컬호스트의 파일 시스템과, 컨테이너를 연결하여, 로컬호스트에 데이터를 저장!!
docker run -v <HOST_DIR>:<CONTAINER_DIR> <IMAGE_NAME>
ex) docker run -p 6000:80 -v $(pwd):/usr/share/nginx/html -d nginx
'핵심만 콕 쿠버네티스' 도서 참고했습니다
오오.... docker 공부하시는군요..!! 멋집니다!