도커 실습 1 - 컨테이너 연동, 파일 복사, 볼륨 마운트, 도커 이미지 생성 > 도커 & 쿠버네티스

본문 바로가기

[실습] 도커 실습 1 - 컨테이너 연동, 파일 복사, 볼륨 마운트, 도커 이미지 생성

필기자
2023-09-06 18:54 2,087 0

본문


목차
  • 컨테이너 연동
  • 파일 복사
  • 볼륨 마운트
  • 도커 이미지 생성

컨테이너 연동

컨테이너 연동 실습 시나리오
  • network 구성
  • mysql 컨테이너 설치
  • 워드프레스 컨테이너 설치
  • 워드프레스 <-> mysql 연동

워드 프레스
  • 웹 사이트를 만들기 위한 소프트웨어
  • 워드프레스가 동작하려면 워드프레스 프로그램 외에도 아파치, 데이터베이스, PHP 런타임 필요
  • 워드프레스 공식 이미지에 워드프레스 프로그램(본체)와 아파치, PHP 런타임 포함
  • 워드프레스는 데이터베이스 중 MySQL 및 MariaDB를 지원


20230906172452_9adc1450f76646e099e11ca3f3d0a0db_x0fq.png


도커 네트워크 생성
  • 워드프레스 프로그램이 MySQL에 저장된 데이터를 읽고 쓰기 위해 두 컨테이너가 연결되어야 함
  • 가상 네트워크를 생성하고 이 네트워크에 두 개의 컨테이너를 소속시켜 두 컨테이너를 연결


#네트워크 생성
docker network create wordpress000net1

20230906172733_9adc1450f76646e099e11ca3f3d0a0db_swyx.png

MySQL 컨테이너 생성 
  • 데이터베이스 서버를 미리 구축하고 설정한 후 워드프레스 컨테이너와 연동하여 사용하기 위해 MySQL 컨테이너를 먼저 생성

#MySQL 컨테이너 생성
docker run --name mysql000ex11 -dit --net=wordpress000net1 -e MYSQL_ROOT_PASSWORD=myrootpass -e MYSQL_DATABASE=wordpress000db -e MYSQL_USER=wordpress000kun -e MYSQL_PASSWORD=wkunpass mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password

20230906173134_9adc1450f76646e099e11ca3f3d0a0db_gpus.png

MySQL 컨테이너 생성시 각 옵션 및 인자의 역할
  • MySQL 데이터베이스를 초기화하고 워드프레스와 연동하기 위해 필요한 설정을 지정
옵션 및 인자 의미
--net=wordpress000net1 ‘wordpress000net1’ 네트워크에 컨테이너 연결
-e MYSQL_ROOT_PASSWORD=myrootpass MySQL 루트 계정의 비밀번호를 ‘myrootpass’ 설정
-e MYSQL_DATABASE=wordpress000db MySQL 데이터베이스의 이름을 ‘wordpress000db’ 설정
-e MYSQL_USER=wordpress000kun MySQL에 생성할 사용자 계정의 이름을 ‘wordpress000kun’으로 설정
-e MYSQL_PASSWORD=wkunpass 위 사용자 계정의 비밀번호를 ‘wkunpass’로 설정
--character-set-server=utf8mb4 MySQL 서버의 기본 문자셋을 ‘utf8mb4’로 설정
문자셋은 다양한 언어와 이모지를 지원하는 유니코드 문자셋
--collation-server=utf8mb4_unicode_ci MySQL 서버의 기본 콜레이션을 ‘utf8mb4_unicode_ci’로 설정
콜레이션은 문자열 비교와 정렬 방식을 지정, 유니코드 문자열의 비교를 위해 사용
--default-authentication-plugin=mysql_native_password MySQL 사용자 계정의 기본 인증 플러그인을 mysql_native_password로 설정

워드프레스 컨테이너 생성


#워드프레스 컨테이너 생성
docker run --name wordpress000ex12 -dit --net=wordpress000net1 -p 8085:80 -e WORDPRESS_DB_HOST=mysql000ex11 -e WORDPRESS_DB_NAME=wordpress000db -e WORDPRESS_DB_USER=wordpress000kun -e WORDPRESS_DB_PASSWORD=wkunpass wordpress

20230906174039_9adc1450f76646e099e11ca3f3d0a0db_mxre.png

워드프레스 컨테이너 생성시 각 옵션 및 인자의 역할
  • 워드프레스와 MySQL 간의 연동을 위해 설정한 데이터베이스 정보를 워드프레스 컨테이너에 전달
옵션 및 인자 의미
--net=wordpress000net1 ‘wordpress000net1’ 네트워크에 컨테이너 연결
-p 8085:80 호스트의 8085 포트와 컨테이너의 80 포트를 매핑하여 외부에서 컨테이너에 접근 가능
-e WORDPRESS_DB_HOST=mysql000ex11 워드프레스가 사용할 MySQL 데이터베이스 호스트의 주소를 ‘mysql000ex11’ 설정
-e WORDPRESS_DB_NAME=wordpress000db 워드프레스가 사용할 데이터베이스의 이름을 ‘wordpress000db‘로 설정
-e WORDPRESS_DB_USER=wordpress000kun 워드프레스와 연결할 데이터베이스 사용자 계정의 이름을 ‘wordpress000kun’ 설정
-e WORDPRESS_DB_PASSWORD=wkunpass 위 사용자 계정의 비밀번호를 ‘wkunpass’로 설정

웹 브라우저를 통해 로컬호스트와 해당 포트번호로 접속 워드프레스 초기 화면
20230906174641_9adc1450f76646e099e11ca3f3d0a0db_7222.png

워드프레스 가입
  • 정보를 입력한 후 '워드프레스 설치' 버튼 클릭
20230906174757_9adc1450f76646e099e11ca3f3d0a0db_3vm9.png

MySQL 컨테이너 내부에 접속하여 워드프레스와 연동이 되어 있는지 가입한 계정 정보 확인
  • 컨테이너에서 리눅스 명령어를 실행하려면 우리 명령을 전달하는 프로그램인 셸(Shell)이 필요

#MySQL 컨테이너 내부로 들어가서 'bash'라는 셸 프로그램 실행
docker exec -it mysql000ex11 bash



#MySQL 데이터베이스 서버에 'wordpress000kun' 사용자로 접속
mysql -u wordpress000kun -p

20230906175751_9adc1450f76646e099e11ca3f3d0a0db_oase.png

계정 정보가 있는 데이터베이스 및 테이블 확인


#사용할 데이터베이스 선택
use wordpress000db;



#계정에 있는 모든 테이블 확인
SHOW TABLES;

20230906180238_9adc1450f76646e099e11ca3f3d0a0db_uh90.png

계정 정보가 있는 테이블 확인


#계정 정보가 있는 테이블 확인
SELECT * FROM wp_users;

20230906180657_9adc1450f76646e099e11ca3f3d0a0db_0rt0.png

도커 명령어 실행을 위해 MySQL 서버 및 컨테이너에서 나가기


#나가기
exit

20230906180827_9adc1450f76646e099e11ca3f3d0a0db_8prr.png

워드프레스 사이트 구축 정리
  • 컨테이너 종료
    • docker stop mysql000ex11
    • docker stop wordpress000ex12
  • 컨테이너 삭제
    • docker rm mysql000ex11
    • docker rm wordpress000ex12
  • 이미지 삭제
    • docker image rm mysql
    • docker image rm wordpress
  • 네트워크 삭제
    • docker network rm wordpress000net1

파일 복사

컨테이너 내부와 호스트 간에 파일을 복사하는 작업의 필요성
  • 데이터 복원 
    • 컨테이너 안의 데이터를 호스트로 백업하거나, 호스트에서 데이터를 컨테이너로 복원할 때 필요
    • 중요한 데이터를 보존하고 컨테이너가 삭제되더라도 안전하게 데이터를 유지
  • 파일 공유
    • 호스트와 컨테이너 간 파일 공유 시 사용
    • 컨테이너 내에서 생성된 결과물이나 로그 파일 등을 호스트에서 확인하고 사용
    • 컨테이너에서 생성된 파일을 호스트에서 사용해야 할 때

파일 복사 명령어
  • 파일 복사는 양방향 모두 가능
  • 컨테이너로 파일을 복사하는 커맨드 사용 예(호스트 -> 컨테이너)
    • docker cp [호스트_경로] [컨테이너_이름] : [컨테이너_경로]
  • 호스트로 파일을 복사하는 커맨드 사용 예(컨테이너 -> 호스트)
    • docker cp [컨테이너_이름] : [컨테이너_경로] [호스트_경로]

컨테이너와 호스트 간에 파일 복사 실습
  • 호스트의 html 파일을 아파치 컨테이너 내부로 복사하여 초기 화면 변경

디렉토리 생성 및 html 파일 생성

#홈 디렉토리 아래 '~/example_html' 디렉토리 생성
mkdir ~/example_html



#nano 텍스트 에디터를 사용 '~/example_html' 디렉토리에 새로운 HTML 파일 생성
nano ~/example_html/index.html

html 내용 작성

<html>
    <meta charset="utf-8"/>
    <body>
        <div> 안녕하세요! </div>
    </body>
</html>


아파치 컨테이너 생성 

#아파치 컨테이너 생성
docker run --name apa000ex19 -d -p 8089:80 httpd

웹 브라우저를 통해 로컬호스트와 해당 포트번호로 접속 20230906182937_9adc1450f76646e099e11ca3f3d0a0db_buux.png

복사 명령어로 호스트에서 컨테이너로 index.html 파일 복사

#'~/example_html/index.html' 파일을 아파치 컨테이너인 'apa000ex19'의 '/usr/local/apache2/htdocs/' 경로로 복사
#아파치 컨테이너의 경로는 아파치 서버가 웹 브라우저에 제공하는 웹 루트 디렉토리
docker cp ~/example_html/index.html apa000ex19:/usr/local/apache2/htdocs/



웹 브라우저에서 로컬호스트와 지정된 포트 번호로 접속하여 업데이트된 초기 화면을 확인 20230906183550_9adc1450f76646e099e11ca3f3d0a0db_dlq2.png

볼륨 마운트

컨테이너의 휘발성
  • 컨테이너가 시작되고 실행되는 동안에는 컨테이너 내의 모든 데이터 및 상태가 보존
  • 컨테이너가 종료되면 컨테이너 내부의 데이터와 상태는 사라짐(파일, 프로세스 상태, 메모리 내용 등)
  • 컨테이너의 휘발성을 극복하기 위해 볼륨이라는 저장 공간을 이용해 데이터의 영속성을 보장

볼륨
  • 컨테이너와 호스트 머신 간 데이터를 안전하게 저장, 관리 및 공유하기 위한 독립적인 저장 공간
  • 도커 엔진에 의해 관리되며 호스트 머신의 파일 시스템과는 분리되어 작동
  • 데이터의 영속성을 보장하고 여러 컨테이너 간에 데이터를 공유 및 백업이 가능

데이터 퍼시스턴시(data persistency)
  • 데이터를 옮기는 작업 대신 처음부터 컨테이너 외부에 데이터를 보관하고 이를 컨테이너에서 사용하는 개념

마운트
  • 호스트의 파일 시스템이나 볼륨을 도커 컨테이너 내부의 특정 경로에 연결하는 작업

마운트의 종류
  • 바인드 마운트
    • 호스트 머신의 디렉토리를 컨테이너 내부에 마운트하여 데이터를 실시간으로 동기화하는 방식
    • 주로 개발 중인 소스 코드나 파일을 컨테이너와 컴퓨터 간에 실시간으로 공유하고 변경 내용을 바로 확인할 때 사용
    • 개발 작업을 편리하게 하고 컨테이너와 호스트 간에 데이터를 손쉽게 주고받을 수 있음
  • 볼륨 마운트
    • 볼륨은 컨테이너에 디스크 형태로 마운트되어 안전하게 데이터를 저장하고 공유하는 방식
    • 데이터베이스나 중요한 설정 파일과 같은 컨테이너 안의 파일을 안전하게 보관하고 다른 컨테이너와 공유할 때 사용
    • 컨테이너 간 데이터를 안전하게 공유하고 영속성을 확보

바인드 마운트 실습
  • 호스트 머신에 디렉토리 생성 후 컨테이너의 내부 경로와 마운트 및 초기 화면 변경

#홈 디렉토리 아래 마운트 할 디렉토리 생성
mkdir ~/apa_folder



#디렉토리와 마운트하는 아파치 컨테이너 생성
#'~/apa_folder' 디렉토리를 아파치 컨테이너의 '/usr/local/apache2/htdocs' 경로로 연결
docker run --name apa000ex20 -d -p 8090:80 -v ~/apa_folder:/usr/local/apache2/htdocs httpd


웹 브라우저에서 로컬호스트와 지정된 포트 번호로 접속하여 초기 화면 확인
  • http://localhost:8090
  • 아무 파일도 없는 경우 "It works"와 같은 기본 초기 화면이 출력되지만, 폴더가 마운트되면 해당 폴더 내의 파일 및 디렉토리 목록이 "Index of /" 초기 화면에 표시
20230906190748_9adc1450f76646e099e11ca3f3d0a0db_9vh4.png

마운트된 디렉토리 경로에 HTML 파일을 넣어 초기 화면을 실시간으로 변경



#nano 텍스트 에디터를 사용 '~/apa_folder' 디렉토리에 새로운 HTML 파일 생성
nano ~/apa_folder/index.html
  • 작성 후 변경 사항 저장 에디터 종료

<html>
    <meta charset="utf-8"/>
    <body>
        <div> 안녕하세요! </div>
    </body>
</html>


웹 브라우저에서 로컬호스트와 지정된 포트 번호로 접속하여 업데이트된 초기 화면을 확인
20230906191138_9adc1450f76646e099e11ca3f3d0a0db_tknb.png

볼륨 마운트 실습
  • 볼륨 생성 후 컨테이너의 내부 경로와 마운트 및 초기 화면 변경


#볼륨 생성
docker volume create apa000vol1



#볼륨을 마운트하는 아파치 컨테이너를 생성
docker run --name apa000ex21 -d -p 8091:80 -v apa000vol1:/usr/local/apache2/htdocs httpd



#볼륨 상세 정보 확인
docker volume inspect apa000vol1

20230906212124_9adc1450f76646e099e11ca3f3d0a0db_gmkr.png


#컨테이너 상세 정보 확인
docker container inspect apa000ex21

20230906212251_9adc1450f76646e099e11ca3f3d0a0db_j83j.png


#볼륨 경로에서 'index.html' 파일 변경
nano /var/lib/docker/volumes/apa000vol1/_data/index.html
  • 기존 초기 화면 html

<html>
    <body>
        <h1>It works!</h1>
    </body>
</html>
  • 업데이트된 초기 화면 html

<html>
    <body>
        <h1>Hello World!</h1>
    </body>
</html>

웹 브라우저에서 로컬호스트와 지정된 포트 번호로 접속하여 업데이트된 초기 화면을 확인 20230906212917_9adc1450f76646e099e11ca3f3d0a0db_lje2.png

도커 이미지 생성

컨테이너에서 이미지를 추출해 생성 실습


#아파치 컨테이너 생성
docker run --name apa000ex22 -d -p 8092:80 httpd



#컨테이너에서 현재 실행 중인 상태를 그대로 새로운 이미지로 생성
#docker commit [컨테이너_이름] [새로운_이미지_이름]
docker commit apa000ex22 ex22_original1



#이미지 목록 확인
docker image ls

20230906214309_9adc1450f76646e099e11ca3f3d0a0db_zwps.png

Dockerfile
  • 도커 이미지를 빌드하기 위한 텍스트 기반의 스크립트 또는 설정 파일
  • docker 스크립트를 재료 폴더에 컨테이너에 넣을 파일과 함께 두어 이미지 생성
  • docker build -t ex22_original2 [재료_폴더_경로]
20230906214939_9adc1450f76646e099e11ca3f3d0a0db_5apc.png

Dockerfile로 이미지 생성 실습


#Dockerfile을 홈 디렉토리 아래 'apa_folder' 디렉토리에 생성
nano ~/apa_folder/dockerfile

20230906215833_9adc1450f76646e099e11ca3f3d0a0db_iryj.png

FROM httpd

COPY index.html /usr/local/apache2/htdocs/

# /tmp 디렉토리를 생성하고 권한을 설정합니다.
RUN mkdir -p /tmp && chmod 1777 /tmp

# 패키지 관리자를 업데이트하고 패키지를 설치합니다.
RUN apt-get update && \
    apt-get install -y apt-utils


#Dockerfile로 이미지 생성
#docker build -t [이미지_이름_지정] [재료_폴더_경로]
docker build -t ex22_original2 ~/apa_folder

20230906220201_9adc1450f76646e099e11ca3f3d0a0db_ukid.png


#이미지 목록 확인
docker image ls

20230906220830_9adc1450f76646e099e11ca3f3d0a0db_wlrm.png


#생성 이미지로 컨테이너 생성
docker run --name ex22 -d -p 8099:80 ex22_original2


웹 브라우저에서 로컬호스트와 지정된 포트 번호로 접속하여 업데이트된 초기 화면을 확인 20230906221221_9adc1450f76646e099e11ca3f3d0a0db_0g7l.png

컨테이너 개조
  • 컨테이너를 실행 중인 상태에서 컨테이너 내부의 파일 시스템, 환경 변수, 네트워크 설정 등을 변경하는 작업

컨테이너를 개조하는 방법
  • 마운트와 파일 복사를 이용
  • 컨테이너에서 리눅스 명령어 실행

컨테이너에서 명령어를 실행하려면 셸이 필요
  • 컨테이너는 가장 일반적으로 사용되는 셸인 'bash'가 설치 되어 있음
  • 컨테이너를 아무 설정 없이 실행하면 bash가 동작하지 않는 상태로 실행되기 때문에 bash를 실행해 명령을 입력받을 수 있는 상태로 만들어야 함
  • 'bash'를 실행하려면 '/bin/bash' 인자를 전달해야 함
  • docker run 또는 docker exec 커맨드와 함께 사용 

docker exec
  • 컨테이너 속에서 명령어를 실행하는 커맨드
  • 'bash' 없이 어느 정도 명령을 직접 전달할 수는 있지만 초기 설정이 없어 동작하지 않는 경우도 있기 때문에 기본적으로는 셸을 통해 명령을 실행
  • docker exec 옵션 [컨테이너_이름] /bin/bash

docker run
  • 컨테이너에 들어있는 소프트웨어를 실행하는 대신 'bash'가 실행되 컨테이너는 실행 중이나 소프트웨어는 실행 중이 아닌 상태가 됨
  • 'bash'를 사용한 컨테이너 조작이 끝나고 나면 다시 docker start 커맨드로 컨테이너를 재시작해야함
  • docker run (옵션) [이미지_이름] /bin/bash

도커 엔진을 통해야 하는 명령
  • 도커 엔진의 시작/종료
  • 네트워크, 디스크 설정, 실행중인 컨테이너 목록 확인 등 컨테이너 전체에 대한 관리 작업
​​​​​​
컨테이너 내부에서 실행하는 명령
  • 컨테이너 속 새로운 소프트웨어 추가
  • 컨테이너 속 소프트웨어의 실행/종료/설정 변경
  • 컨테이너 안과 밖의 파일 복사/이동/삭제 작업

댓글목록0

등록된 댓글이 없습니다.
게시판 전체검색