Post

도커 이미지 만들기

도커 이미지 만들기

1. docker를 사용해서 httpd 이미지에서 쉘을 실행하기

1
$ docker run -it httpd /bin/bash

명령어 뜯어보기

  • docker run: docker 컨테이너 실행
  • -it: 컨테이너와 상호작용하기 위한 옵션
    • i: interactive(대화형)를 의미, 표준 입력을 유지하고 컨테이너를 유지시키는 역할
    • t: tty를 의미, 가상 터미널 장치를 사용하여 컨테이너와 상호작용할 수 있게 해줌
  • httpd: 실행할 docker 이미지 이름
  • /bin/bash: 쉘을 실행하는 명령어(컨테이너 내부에서 실행할 명령어)

2. 기본 디렉토리 지정하기

1
/usr/local/apache2# grep DocumentRoot /usr/local/apache2/conf/httpd.conf

명령어 뜯어보기

  • grep: 주어진 파일에서 지정된 패턴을 검색하는 명령어
  • DocumentRoot: Apache 설정파일에서 웹서버가 문서를 제공하는 기본 디렉토리를 지정하는 지시문
  • httpd.conf: 웹 서버의 주요 설정 파일

3. 현재 작업 디렉토리 확인하기

1
/usr/local/apache2# pwd

4. 현재 디렉토리에 있는 파일과 목록 확인하기

1
/usr/local/apache2# ls -l

💡결과

1
2
3
4
5
6
7
8
9
10
11
total 40
drwxr-xr-x 2 root root 4096 Feb 13 01:55 bin
drwxr-xr-x 2 root root 4096 Feb 13 01:55 build
drwxr-xr-x 2 root root 4096 Feb 13 01:55 cgi-bin
drwxr-xr-x 4 root root 4096 Feb 13 01:55 conf
drwxr-xr-x 3 root root 4096 Feb 13 01:55 error
drwxr-xr-x 2 root root 4096 Feb 13 01:55 htdocs
drwxr-xr-x 3 root root 4096 Feb 13 01:55 icons
drwxr-xr-x 2 root root 4096 Feb 13 01:55 include
drwxr-xr-x 2 root root 4096 Feb 13 01:55 logs
drwxr-xr-x 2 root root 4096 Feb 13 01:55 modules

5. htdocs폴더로 이동

1
/usr/local/apache2# cd htdocs

명령어 뜯어보기

  • cd: 폴더를 이동하는 명령어

6. hotdocs에 있는 파일 목록 확인하기

1
/usr/local/apache2/htdocs# ls -l

💡결과

1
2
total 4
-rw-r--r-- 1 504 staff 45 Jun 11  2007 index.html

7. index.html 내용 확인하기

1
/usr/local/apache2/htdocs# cat index.html

명령어 뜯어보기

  • cat 파일의 내용을 화면에 출력하는 명령어
    • cat [옵션] [파일명]형식으로 사용

💡결과

1
<html><body><h1>It works!</h1></body></html>

8. index.html 파일 내용 변경하기

1
2
/usr/local/apache2/htdocs# cat > index.html
<html><body><h1>New Page!</h1></body></html>

위의 명령어를 입력하고 변경할 내용을 모두 작성했다면, ctrl + d를 눌러서 입력 종료하기

명령어 뜯어보기

  • cat: 파일의 내용을 화면에 출력하는 명령어
  • >: 리다이렉트(연결)
  • <html><body><h1>New Page!</h1></body></html>: 변경할 내용

9. 변경된 내용 확인하기

1
/usr/local/apache2/htdocs# httpd-foreground

명령어 뜯어보기

  • httpd-foreground: 웹 서버를 실행할 때 사용하는 명령어

9-1. 또는 커멘드 라인에서 확인하기

1
/usr/local/apache2/htdocs# cat index.html

💡결과

1
<html><body><h1>New Page!</h1></body></html>

10. 쉘 실행 종료하기

1
:/usr/local/apache2/htdocs# exit

11. docker 컨테이너 목록 확인하기

1
docker ps -a

💡결과

1
2
CONTAINER ID   IMAGE     COMMAND                  CREATED             STATUS                            PORTS                    NAMES
a1b5e38aee50   httpd     "/bin/bash"              About an hour ago   Exited (127) About a minute ago                            optimistic_khayyam

12. 중단된 컨테이너에 다시 쉘을 붙이기

1
docker start a1b5e38aee50

명령어 뜯어보기

  • start: 정지된 컨테이너를 다시 시작하는데 사용하는 명령어
    • `docker start [컨테이너 ID컨테이너 이름]

연결되었는지 확인

1
docker ps

현재 실행중인 docker 컨테이너의 목록을 확인하는 명령어를 입력하여 잘 실행되고 있는지 확인할 수 있음

💡결과

1
2
CONTAINER ID   IMAGE     COMMAND                  CREATED             STATUS             PORTS                    NAMES
a1b5e38aee50   httpd     "/bin/bash"              About an hour ago   Up 40 seconds      80/tcp                   optimistic_khayyam

13. 실행하고 있는 컨테이너에 새로운 터미널을 붙여서 bash shell 얻기

1
docker exec -it a1b5e38aee50 /bin/bash

💡결과

1
/usr/local/apache2#

14. 변경했던 index.html 내용 다시 확인하기

1
/usr/local/apache2# cat ./htdocs/index.html

htdocs 폴더에 있는 index.html의 내용을 확인하기 위해 cat 명령어와 파일의 경로를 작성

💡결과

1
<html><body><h1>New Page!</h1></body></html>

15. docker 컨테이너의 상태를 이미지로 저장하기

1
docker commit a1b5e38aee50 my_httpd:0.1

명령어 뜯어보기

  • commit: docker 컨테이너의 상태를 이미지로 저장하는 명령어
    • commit [컨테이너 ID] [이미지 이름:태그]
  • a1b5e38aee50: 커밋하려는 컨테이너 아이디
  • my_httpd:0.1: 새 이미지의 이름과 태그

제대로 이미지가 저장되었는지 확인해보기

1
docker images

💡결과

1
2
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
my_httpd     0.1       d42c557b5e46   19 seconds ago   167MB

16. 새롭게 만든 이미지 실행하기

1
docker run my_httpd:0.1 httpd-foreground

💡결과

1
2
3
4
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.4. Set the 'ServerName' directive globally to suppress this message
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.4. Set the 'ServerName' directive globally to suppress this message
[Mon Mar 11 08:30:42.093345 2024] [mpm_event:notice] [pid 1:tid 139715227473792] AH00489: Apache/2.4.58 (Unix) configured -- resuming normal operations
[Mon Mar 11 08:30:42.093818 2024] [core:notice] [pid 1:tid 139715227473792] AH00094: Command line: 'httpd -D FOREGROUND'

이미지 생성 자동화하기

개념

Dockerfile

  • 계층 구조를 이용하여 도커 이미지를 만드는 절차를 작성하는 파일
  • FROM [--platform=<platform>] <image> [AS <name>]
  • RUN <command>
  • ENTRYPOINT ["executable","param1","param2"]

이미지 빌드 명령어

  • docker build [옵션] PATH | URL

이미지 레지스트리에 올리기

1. 도커 허브에 로그인

1
docker login

위의 명령어를 입력하고, 이메일과 비밀번호를 입력하면 로그인이 됨

1
2
3
4
5
6
7
8
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: [이메일 주소]
Password:
WARNING! Your password will be stored unencrypted in /home/hm/snap/docker/2915/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

2. 만든 이미지에 태그를 붙이기

1
docker tag my_httpd:0.1 hyeem66/my_httpd:0.1

명령어 뜯어보기

  • push:
    • push [컨테이너이름:태그] [docker_hub_id/image name]
  • my_httpd:0.1: 올리려고 하는 컨테이너 이름:태그
  • hyeem66/my_httpd:0.1: 도커 허브 사용자 이름와 이미지 이름:태그

제대로 태그가 되었는지 확인해보기

1
docker images

💡결과

1
2
3
REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
my_httpd          0.1       d42c557b5e46   20 minutes ago   167MB
hyeem66/my_httpd   0.1       d42c557b5e46   20 minutes ago   167MB

3. 빌드하고, 도커 허브에 업로드하기

1
docker push hyeem66/my_httpd:0.1

명령어 뜯어보기

  • push: 이미지를 레지스트리에 업로드하는 명령어
  • hyeem66/my_httpd:0.1: 업로드할 docker 이미지의 이름과 태그
    • hyem66: docker hub 사용자 이름
    • my_httpd:0.1: 이미지이름:태그

💡결과

1
2
3
4
5
6
7
8
9
The push refers to repository [docker.io/hyeem66/my_httpd]
4509f1dadbc3: Pushed
83e84e8d7bd1: Pushed
ee9a39d3b67e: Pushed
70d67450158d: Pushed
5f70bf18a086: Pushed
8f562cbc866f: Pushed
ceb365432eec: Pushed
0.1: digest: sha256:ec09f8... size: 1779

이미지 레지스트리에서 다운 받아서 사용하기

1
docker run hyeem66/my_httpd:0.1

💡결과
local에 이미지가 없으면 허브에서 pull 받아서 사용

1
2
3
4
5
6
7
8
9
10
Unable to find image 'hyeem66/my_httpd:0.1' locally
0.1: Pulling from hyeem66/my_httpd
e1caac4eb9d2: Already exists
87b0fe460fd9: Already exists
4f4fb700ef54: Already exists
9cebd3e3b523: Already exists
e9304da947c5: Already exists
b60d4b66b268: Already exists
be2abe826808: Pull complete
...
This post is licensed under CC BY 4.0 by the author.