본문 바로가기
Docker

Centos7 도커 이미지로 빌드하기 with Dockerfile

by 정권이 내 2023. 9. 25.

윈도우에서 Docker 이미지 build, push와 리눅스 실행하기

 

팀에서 새 버전의 프로그램을 출시할때마다 항상 리눅스 OS환경을 구축하고 환경 설정하고 이거하고 저거하고 그러다 작업중에 꼬이기라도 하면 다시 설치해야 되서 시간도 오래걸리고 스트레스받고 여간 불편한 일이 아니었습니다.

최근에 클라우드 프로젝트를 계속 진행하면서 도커, 컨테이너에 대한 개념도 익숙해졌고 이번 기회에 제품 테스트용 리눅스 OS를 도커 이미지로 만들어서 어느 환경에서든지 쉽게 리눅스 OS를 구축할수 있도록 해보았습니다.

 

이 글에서 다루는 내용

  • Centos7 기본 Docker Image을 활용한 커스텀 OS 환경 만들기 (Dockerfile)
  • 도커 이미지 빌드하기
  • 도커 이미지 Docker Hub에 푸시하기
  • 도커 컨테이너/이미지 중지(stop), 삭제(delete)
  • 도커 이미지 Pull 받기

 

실행 전 준비과정

이 글은 윈도우에 Docker Desktop 설치가 되있고 Docker가 실행중인 환경이라는 가정하에 작성되었습니다.

  • Docker Desktop 설치 완료
  • CPU 가상화 기능 활성화(Intel VT-x/AMD-v)
  • Hyper-V 기능 활성화

 

Dockerfile 만들기

  • Centos7 환경을 우리가 원하는 구성으로 언제 어디서나 실행하기위해 Centos7 기반으로 Dockerfile을 작성해보겠습니다.
  • 파일이름은 반드시 Dockerfile로 해야 합니다.

Dockerfile: 컨테이너 이미지를 빌드하기위한 텍스트 기반의 설정파일.

 

Dockerfile 내용

# 기반 이미지로 CentOS 7.9.2009를 사용합니다.
FROM centos:7.9.2009

# 컨테이너 내부에서 사용할 포트를 노출합니다. (ssh,ftp,http,db)
EXPOSE 20 21 22 80 3306 1521

# 필요한 패키지를 설치합니다 (예시)
RUN yum install -y openssh-server openssh-clients httpd vim-enhanced openssl-devel sqlite-devel net-tools tar gdb

# KST (Asia/Seoul) 시간대로 설정합니다.
RUN ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

# 한국어 locale 설정
RUN localedef -f UTF-8 -i ko_KR ko_KR.utf8
RUN export LANG=ko_KR.utf8
RUN export LC_ALL=ko_KR.utf8

# root 사용자의 비밀번호를 설정합니다.
RUN echo 'root:root' | chpasswd

# '사용자 ID/PW을 생성합니다.
RUN useradd -m ksr930
RUN echo 'ksr930:ksr930' | chpasswd

# /my-system 디렉토리를 생성, ksr930 계정 권한 부여
RUN mkdir /my-system && chown -R ksr930:ksr930 /my-system

# SSH 서비스를 활성화하고 포트를 설정합니다.
RUN systemctl enable sshd
RUN sed -i 's/#Port 22/Port 22/g' /etc/ssh/sshd_config

# Apache 웹 서버를 활성화하고 포트를 설정합니다.
RUN systemctl enable httpd
RUN sed -i 's/Listen 80/Listen 80/g' /etc/httpd/conf/httpd.conf

# systemd 서비스이용하기 위한 명령 실행
CMD ["/usr/sbin/init"]

 

Docker 이미지 build & push

  • 도커 이미지를 빌드하기 전에 Docker Hub에 Repository를 먼저 생성합니다.

 

Docker Image build

  • cmd 창에서 Dockerfile 파일이 있는 경로로 이동후 다음과 같이 명령어를 실행합니다.
  • -t는 태그를 지정하는 옵션입니다.
# 원본 명령어
docker build -t <namespace>/<repository>:<tag> .

# 예시
docker build -t ksl930/test-repo:1.0 .
[+] Building 100.2s (18/18) FINISHED
=> [internal] load build definition from Dockerfile 
=> => transferring dockerfile: 1.35kB 
=> [internal] load .dockerignore 
=> => transferring context: 2B 
=> [internal] load metadata for docker.io/library/centos:7.9.2009 
=> CACHED [ 1/14] FROM docker.io/library/centos:7.9.2009@sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4 
=> [ 2/14] RUN yum install -y openssh-server openssh-clients httpd vim-enhanced openssl-devel sqlite-devel net-tools tar gdb 
=> [ 3/14] RUN ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime 
=> [ 4/14] RUN localedef -f UTF-8 -i ko_KR ko_KR.utf8 
=> [ 5/14] RUN export LANG=ko_KR.utf8 
=> [ 6/14] RUN export LC_ALL=ko_KR.utf8 
=> [ 7/14] RUN echo 'root:root' | chpasswd 
=> [ 8/14] RUN useradd -m ksr930 
=> [ 9/14] RUN echo 'ksr930:ksr930' | chpasswd 
=> [10/14] RUN mkdir /my-system && chown -R ksr930:ksr930 /my-system 
=> [11/14] RUN systemctl enable sshd 
=> [12/14] RUN sed -i 's/#Port 22/Port 22/g' /etc/ssh/sshd_config 
=> [13/14] RUN systemctl enable httpd 
=> [14/14] RUN sed -i 's/Listen 80/Listen 80/g' /etc/httpd/conf/httpd.conf 
=> exporting to image 
=> => exporting layers 
=> => writing image sha256:370e0cabaee4a4f386439237273e7e5482e4a488b20562711226fd2ea2ad7500 
=> => naming to docker.io/ksl930/test-repo:1.0 

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix t

 

  • 이미지가 생성되었는지 확인합니다.
docker images
REPOSITORY         TAG       IMAGE ID       CREATED         SIZE
ksl930/test-repo   1.0       370e0cabaee4   5 minutes ago   544MB

 

Docker Image push

  • 도커 이미지를 Docker Hub에 업로드 하기 위해 먼저 로그인을 해야합니다.
  • Docker Hub 계정과 비밀번호를 입력하면 됩니다.
docker login

 

  • 로그인이 되었다면 이미지를 push 합니다.
# 원본 명령어
docker push <namespace>/<repository>:<tag>

# 예제
docker push ksl930/test-repo:1.0

 

Docker Image 실행하기

# 원본 명령어
docker run [OPTION] <namespace>/<repository>:<tag>

# 예제
docker run -d -p 20:20 -p 21:21 -p 22:22 -p 80:80 -p 3306:3306 -p 1521:1521 --name test-container ksl930/test-repo:1.0

 

  • 실행시 몇가지 옵션을 사용하는데 옵션들의 의미는 다음과 같습니다.
옵션 설명
-d 컨테이너를 백그라운드로 실행
-p 포트포워딩을 설정하여 컨테이너의 내부포트와 연결될 외부포트를 설정
--name 실행할 컨테이너의 이름

 

컨테이너에 접속하기

  • Dockerfile의 설정대로 이미지가 제대로 만들어졌는지 확인하기 위해 컨테이너에 접속해보겠습니다.
docker exec -it <container_name> /bin/bash

 

img

  • 이방법은 cmd에서 접속하는 방법이고 ssh 접속 프로그램으로도 접속이 가능합니다. 로컬 윈도우 환경에서 실행중인 컨테이너이므로 ssh로 접속시 호스트 IP는 127.0.0.1로 지정하면 됩니다.

 

Docker 컨테이너 / 이미지 Delete & Pull

  • 실행중인 도커 컨테이너를 종료후 컨테이너와 이미지를 삭제한 다음에 Docker Hub에서 이미지를 Pull 받아서 실행 해보겠습니다.

 

Docker 컨테이너 삭제

  • 실행중인 도커 컨테이너의 ID or NAME을 확인하여 컨테이너를 중지시킵니다.
docker ps -a
docker stop <container_id> or <names>

 

  • 컨테이너 중지후에 컨테이너를 삭제합니다.
docker rm <container_id> or <names>

 

Docker 이미지 삭제

  • 로컬 Docker에 올라와있는 이미지를 검색후 삭제할 이미지의 id를 지정합니다.
docker images
========================================
REPOSITORY         TAG       IMAGE ID       CREATED      SIZE
ksl930/test-repo   1.0       370e0cabaee4   2 days ago   544MB
docker rmi 370e0cabaee4
========================================
Untagged: ksl930/test-repo:1.0
Untagged: ksl930/test-repo@sha256:a93ebdf91cfbc23e81d78ded8d671ae39c781d35729626780fd994ed64c725a7
Deleted: sha256:370e0cabaee4a4f386439237273e7e5482e4a488b20562711226fd2ea2ad7500

 

Docker 이미지 Pull

  • Docker Hub에 업로드한 이미지를 Pull 받고 확인합니다.
docker pull <namespace>/<repository>:<tag>
docker images
========================================
REPOSITORY         TAG       IMAGE ID       CREATED      SIZE
ksl930/test-repo   1.0       370e0cabaee4   2 days ago   544MB

 

Docker 이미지 실행하기

  • 도커 이미지를 다시 실행하고 컨테이너에 접속까지 해보겠습니다.
# 원본 명령어
docker run [OPTION] <namespace>/<repository>:<tag>

# 예제
docker run -d -p 20:20 -p 21:21 -p 22:22 -p 80:80 -p 3306:3306 -p 1521:1521 --name test-container ksl930/test-repo:1.0
docker ps -a
========================================
CONTAINER ID   IMAGE                  COMMAND            CREATED         STATUS         PORTS                                                                                          NAMES
8eb6cd33693e   ksl930/test-repo:1.0   "/usr/sbin/init"   3 seconds ago   Up 2 seconds   0.0.0.0:20-22->20-22/tcp, 0.0.0.0:80->80/tcp, 0.0.0.0:1521->1521/tcp, 0.0.0.0:3306->3306/tcp   test-container
docker exec -it test-container /bin/bash
========================================
[root@8eb6cd33693e /]# ll
total 72
-rw-r--r--   1 root   root   12114 Nov 13  2020 anaconda-post.log
lrwxrwxrwx   1 root   root       7 Nov 13  2020 bin -> usr/bin
drwxr-xr-x   3 root   root    4096 Sep 22 17:10 boot
drwxr-xr-x   5 root   root     340 Sep 25 10:49 dev
drwxr-xr-x   1 root   root    4096 Sep 25 10:49 etc
drwxr-xr-x   1 root   root    4096 Sep 22 17:10 home
lrwxrwxrwx   1 root   root       7 Nov 13  2020 lib -> usr/lib
lrwxrwxrwx   1 root   root       9 Nov 13  2020 lib64 -> usr/lib64
drwxr-xr-x   2 root   root    4096 Apr 11  2018 media
drwxr-xr-x   2 root   root    4096 Apr 11  2018 mnt
drwxr-xr-x   2 ksr930 ksr930  4096 Sep 22 17:10 my-system
drwxr-xr-x   2 root   root    4096 Apr 11  2018 opt
dr-xr-xr-x 300 root   root       0 Sep 25 10:49 proc
dr-xr-x---   2 root   root    4096 Nov 13  2020 root
drwxr-xr-x   1 root   root    4096 Sep 22 17:10 run
lrwxrwxrwx   1 root   root       8 Nov 13  2020 sbin -> usr/sbin
drwxr-xr-x   2 root   root    4096 Apr 11  2018 srv
dr-xr-xr-x  11 root   root       0 Sep 25 10:49 sys
drwxrwxrwt   1 root   root    4096 Sep 22 17:10 tmp
drwxr-xr-x   1 root   root    4096 Nov 13  2020 usr
drwxr-xr-x   1 root   root    4096 Sep 22 17:10 var

 

연관 포스팅

반응형

댓글