Contents

Docker Life Cycle

   May 10, 2023     8 min read

도커 퍼블릭 레지스트리 검색 및 확인

  • 도커 레지스트리에는 사용자가 사용할 수 있도록 데이터베이스를 통해 Image를 제공해주고 있음.
  • 누구나 이미지를 만들어 푸시할 수 있으며 푸시된 이미지는 다른 사람들에게 공유 가능

https://hub.docker.com

# sudo docker search tomcat


사진첨부

도커 라이프 사이클 이해하기

사진첨부

ubuntn 이미지로 컨테이너를 생성하고, 실행하기

$ docker run -i -t ubuntu bash


  • -i 옵션 : interactive로 STDIN, 표준 입력을 연결하는 옵션.
  • -t 옵션 : TTY를 연결하는 옵션.

실행 중인 컨테이너에서 나오기

  • 실행 중인 컨테이너에서 나올 때는 2가지 방법이 있음.
  1. ctrl + P + Q를 통해 컨테이너를 종료시키지 않고 빠져나옴.
  2. exit 명령어를 통해 컨테이너를 종료시키고 빠져나옴.

종료된 컨테이너 실행하고 접근하기

$ docker start -a [컨테이너 id]

or

$ docker start [컨테이너 id]
$ docker attach [컨테이너 id]



컨테이너 삭제하기

  • 컨테이너를 삭제하는 3가지 방법
    1. $ docker rm [컨테이너 id] : 컨테이너 하나씩 삭제
    2. $ docker rm 'docker ps -a -q' : 전체 컨테이너 삭제
    3. $ docker container prune : 정지된 컨테이너들만 전부 삭제

실행 중인 컨테이너에 접근

$ docker attach [컨테이너 id]



도커에서 컨테이너 순차적으로 실행하기

# docker pull nginx
# docker images
# docker ps -a

# docker create nginx
# docker ps
# docker ps –a

# docker start [Container’ID]
# docker ps
# docker ps –a

# docker stop [Container’ID]
# docker ps
# docker ps –a

# docker start [Container’ID]
# docker ps
# docker ps –a



도커에서 컨테이너 한 번에 실행하기

# docker run -d [-p 80:80 --name nginx01] nginx
# docker images
# docker ps
# docker ps –a



참고

$ docker ps // 실행중인것만
$ docker ps -a // 모든것
$ docker stop [컨테이너ID] // 중지
$ docker rm [컨테이너ID], [컨테이너ID] // 삭제
$ docker rm `docker ps -a -q` // 모든 컨테이너 삭제
$ sudo docker rmi `docker images -q` // 모든 이미지 삭제

$ docker images //이미지 리스트
$ docker rmi [이미지ID] // 이미지 삭제
$ docker rmi -f [이미지ID] // 컨테이너가 있어서 삭제가 안될경우, 컨테이너까지 다 삭제
// 에러뜨면, $docker stop [컨테이너ID] 실행후 다시 삭제하기



사진첨부

  • nginx로도 접근이 가능하다

dockerfile 생성

  • Dockerfile은 docker 이미지 생성을 위한 이미지 설정 파일
  • Dockerfile에 사용할 수 있는 명령어들을 사용해서 docker image를 생성한다.

사진첨부

연습 1.

$ vi dockerfile
FROM ubuntu

RUN apt -y update
RUN apt –y upgrade

$ docker build -t my-ubuntu:1.0 .
$ docker images

$ docker run -it my-ubuntu:1.0 bash
$ apt -y update //All packages are up to date.



연습 2.

$ vi dockerfile
FROM ubuntu

CMD [“ls” , “-al”]

$ docker build -t my-ubuntu:1.0 .
$ docker images

$ docker run my-ubuntu:1.0 
//ls –al 명령어를 실행하고 종료됨

$ docker run my-ubuntu:1.0 “date” 
//오버라이딩됨



Public 레지스트리 구현 및 사용

Step 01. 도커 빌드할 프로그램 준비

  • python을 사용해 단순한 서비스를 시작 작성한다. 다음 파일을 작성하여 test_server.py로 저장한다.

# vi test_server.py
# test_server.py
import socket

with socket.socket() as s:
s.bind(("0.0.0.0", 12345))
s.listen()
print("server is started")
conn, addr = s.accept()
# conn 클라이언트와 통신할 소켓
# addr 클라이언트의 정보가 들어있음
with conn:
print("Connected by", addr)
while True:
data = conn.recv(1024)
if not data: break
conn.sendall(data)

# python3 test_server.py



  • 다른 콘솔창에서 아래 명령어 실행하기
# nc 127.0.0.1 12345
hello
hello



사진첨부

Step 02. 도커 파일 생성

  • dockerfile과 위에서 생성한 python 파일을 같은 디렉토리에 배치한다.
# mkdir my_first_project
# mv test_server.py ./my_first_project/
# cd my_first_project
# ls

# vi dockerfile
FROM python:3.7
RUN mkdir /echo
COPY test_server.py /echo
CMD ["python", "/echo/test_server.py"]



  • 빌드 후 테스트하기)
# sudo docker build -t echo_test . 
# sudo docker images 
# sudo docker run -t -p 12345:12345 --name et --rm echo_test //컨테이너 중지되면 컨테이너 자동삭제



  • 다른 콘솔에서 테스트하기
# nc 127.0.0.1 12345
hello
hello



사진첨부

Step 03. 도커 이미지 태그 변경 후 푸시

  • 먼저 회원가입하기
https://hub.docker.com/



  • 회원가입한 정보를 토대로 다음 내용을 작성한다.
  • login을 하지 않으면 정상 작동되지 않는다.
  • [loginID/register이름:Image이름] 라는 문자열은 여러분이 사용하는 아이디로 바꿔서 실행해야만 한다.

# sudo docker login 
# sudo docker tag echo_test loginID/register이름: echo_test 
# sudo docker images 
# sudo docker push loginID/register이름: echo_test



  • https://hub.docker.com/ 에 접속하여 내 레파지토리에 도커가 잘 등록됐는지 확인해본다.

  • 모든 이미지 삭제 후 다시 [ loginID/register이름: echo_test ] 실행하여 잘 다운로드돼 실행되는지 테스트한다.

# sudo docker rmi `docker images -q` -f 
# sudo docker run -t -p 12345:12345 --name et --rm loginID/register이름: echo_test



Step 04. 도커 이미지 히스토리 확인

  • 다음 명령을 사용하면 도커 이미지가 어떤 히스토리를 가졌는지 확인할 수 있다.
  • 제일 상단에 앞서 우리가 dockerfile을 빌드해서 추가한 정보가 있다.

# docker history loginID/register이름: echo_test



도커 resposity 만들기

사진첨부

사진첨부

Private 레지스트리 구현 및 사용

Step 01. 도커 레지스트리 이미지 다운 받기

  • 먼저 docker pull 명령어로 공식 저장소에서 도커 레지스트리 이미지의 최신 버전을 받아오기
$ docker pull registry:latest



  • 이미지 받았으면 images 명령어로 이미지가 정상적으로 저장되었는지 확인하기
$ docker images



  • registry 이미지로 도커를 실행하면 8fa28fa로 시작하는 컨테이너 아이디를 볼 수 있음. 컨테이너 아이디는 그때그때 다름.
$ docker run --name personal-registry -d -p 5000:5000 registry



  • --name : 이름을 지정하는 플래그
  • -d : 백그라운드에서 실행
  • -p {host_port}:{container_port} : 포트 노출을 위한 맵핑
  • registry : 실행하고자하는 이미지의 이름

  • 컨테이너가 정상적으로 실행됐는지 확인하기 위해 ps -l 명령어를 실행
  • 정상적으로 실행되었다면 컨테이너 목록에서 레지스트리 서버를 확인할 수 있음.

$ docker ps

$ curl http://127.0.0.1:5000/v2/ 서비스 접속 가능한지 확인 (그냥 넘어가기)



Step 02. 사용자 도커 이미지 만들기

$ vi dockerfile
FROM ubuntu:12.04
MAINTAINER Ja Kim <ja@gmail.com>
CMD echo 'Hello, Docker!'



  • Dockerfile을 만들었으면 이 파일을 빌드해서 새로운 이미지를 생성하기
  • 아래 내용을 참고해서 빌드하기
  • 여기서 -t 플래그를 통해서 이미지의 이름을 지정할 수 있음.
$ docker build -t hello_docker .



  • 이미지가 정상적으로 빌드되었는지 images 명령어로 확인하기
$ docker images



  • 이미지가 정상적으로 빌드되었으니 실행하기.
  • 간단히 run에 이미지 이름을 넘겨주기
    $ docker run hello_docker
    Hello, Docker!
    



  • Dockerfile을 유심히 봤다면 눈치챘겠지만, ‘Hello, Docker!’를 출력하는 단순한 이미지임. 중요한 점은 echo 명령어는 실행하자마자 종료되는 프로세스이기 때문에 docker ps 에서 이 컨테이너를 확인할 수 없다는 점.
  • 컨테이너에서는 자신에게 주어진 주 프로세스가 종료되면 컨테이너도 따라 종료된다.
  • 이를 확인하기 위해 -a 플래그를 사용한다.

$ docker ps -a



Step 03. 도커 레지스트리에 PUSH 하기

  • 이미지가 정상적으로 작동하는 것을 확인했으니 이제 이미지를 도커 레지스트리에 집어넣어보기.
  • 먼저 이미지를 도커 레지스트리에 넣기 위해 이미지에 적당한 이름을 붙여준다.
  • docker tag 명령어로 이미지에 새로운 이름을 붙여준다.
$ docker tag hello_docker 0.0.0.0:5000/hello_docker



  • tag 명령어를 실행하면 같은 이미지에 새로운 이름이 부여됨.
  • images 명령어로 확인해보기
$ docker images



  • IMAGE ID에서 확인할 수 있듯이 열거된 두 이미지는 이름만 다른 같은 이미지이다.
  • 이렇게 / 앞에 도커 레지스트리의 주소르 지정해 이름을 부여하고 push 하면 해당하는 도커 레지스토리에 이미지가 업로드 된다.

<형식> docker push <hostname>:<repository-port>/<image>:<tag>

$ docker push 0.0.0.0:5000/hello_docker



Step 04. 도커 레지스트리에서 PULL 받아 실행하기

  • 도커 레지스트리에 이미지를 업로드 했으니 거꾸로 이 도커 레지스트리에서 이미지를 pull 받아 실행해보기
  • 로컬 도커 서버에 같은 이미지가 있으면 정확한 확인이 안 되니, 로컬에서 실행했던 컨테이너와 이미지를 삭제하기.

$ docker ps -a

$ docker images

$ docker rmi hello_docker



  • 도커 레지스트리의 주소를 지정한 이름을 사용하면 도커는 해당하는 주소에 도커 이미지가 있는지 먼저 검색함
  • 공유된 도커 이미지의 실행은 먼저 PULL을 받고 실행하는 단계를 거침. BUT 바로 실행(run) 명령어를 사용하면 도커는 자동적으로 해당하는 주소의 이미지를 풀 받고 실행한다.

$ docker run 0.0.0.0:5000/hello_docker



  • 원격에서 도커 레지스트리 사용하기
  • 이 예제에서는 로컬에서 도커 레지스트리와 도커 실행 서버를 둘 다 운영하고 있어서 실제로 제대로 작동하는 건지 확인하기가 어렵다. 가능하다면 자신의 로컬 머신을 외부에 노출시켜서 다른 도커 서버에서 실행해보자.