[실습] 도커 실습 1 - 컨테이너 연동, 파일 복사, 볼륨 마운트, 도커 이미지 생성
필기자
2023-09-06 18:54
2,087
0
본문
목차
- 컨테이너 연동
- 파일 복사
- 볼륨 마운트
- 도커 이미지 생성
컨테이너 연동
컨테이너 연동 실습 시나리오
- network 구성
- mysql 컨테이너 설치
- 워드프레스 컨테이너 설치
- 워드프레스 <-> mysql 연동
워드 프레스
- 웹 사이트를 만들기 위한 소프트웨어
- 워드프레스가 동작하려면 워드프레스 프로그램 외에도 아파치, 데이터베이스, PHP 런타임 필요
- 워드프레스 공식 이미지에 워드프레스 프로그램(본체)와 아파치, PHP 런타임 포함
- 워드프레스는 데이터베이스 중 MySQL 및 MariaDB를 지원
도커 네트워크 생성
- 워드프레스 프로그램이 MySQL에 저장된 데이터를 읽고 쓰기 위해 두 컨테이너가 연결되어야 함
- 가상 네트워크를 생성하고 이 네트워크에 두 개의 컨테이너를 소속시켜 두 컨테이너를 연결
#네트워크 생성
docker network create wordpress000net1
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
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
워드프레스 컨테이너 생성시 각 옵션 및 인자의 역할
- 워드프레스와 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’로 설정 |
웹 브라우저를 통해 로컬호스트와 해당 포트번호로 접속 워드프레스 초기 화면
워드프레스 가입
- 정보를 입력한 후 '워드프레스 설치' 버튼 클릭
MySQL 컨테이너 내부에 접속하여 워드프레스와 연동이 되어 있는지 가입한 계정 정보 확인
- 컨테이너에서 리눅스 명령어를 실행하려면 우리 명령을 전달하는 프로그램인 셸(Shell)이 필요
#MySQL 컨테이너 내부로 들어가서 'bash'라는 셸 프로그램 실행
docker exec -it mysql000ex11 bash
#MySQL 데이터베이스 서버에 'wordpress000kun' 사용자로 접속
mysql -u wordpress000kun -p
계정 정보가 있는 데이터베이스 및 테이블 확인
#사용할 데이터베이스 선택
use wordpress000db;
#계정에 있는 모든 테이블 확인
SHOW TABLES;
계정 정보가 있는 테이블 확인
#계정 정보가 있는 테이블 확인
SELECT * FROM wp_users;
도커 명령어 실행을 위해 MySQL 서버 및 컨테이너에서 나가기
#나가기
exit
워드프레스 사이트 구축 정리
- 컨테이너 종료
- 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
웹 브라우저를 통해 로컬호스트와 해당 포트번호로 접속
복사 명령어로 호스트에서 컨테이너로 index.html 파일 복사
#'~/example_html/index.html' 파일을 아파치 컨테이너인 'apa000ex19'의 '/usr/local/apache2/htdocs/' 경로로 복사
#아파치 컨테이너의 경로는 아파치 서버가 웹 브라우저에 제공하는 웹 루트 디렉토리
docker cp ~/example_html/index.html apa000ex19:/usr/local/apache2/htdocs/
웹 브라우저에서 로컬호스트와 지정된 포트 번호로 접속하여 업데이트된 초기 화면을 확인
볼륨 마운트
컨테이너의 휘발성
- 컨테이너가 시작되고 실행되는 동안에는 컨테이너 내의 모든 데이터 및 상태가 보존
- 컨테이너가 종료되면 컨테이너 내부의 데이터와 상태는 사라짐(파일, 프로세스 상태, 메모리 내용 등)
- 컨테이너의 휘발성을 극복하기 위해 볼륨이라는 저장 공간을 이용해 데이터의 영속성을 보장
볼륨
- 컨테이너와 호스트 머신 간 데이터를 안전하게 저장, 관리 및 공유하기 위한 독립적인 저장 공간
- 도커 엔진에 의해 관리되며 호스트 머신의 파일 시스템과는 분리되어 작동
- 데이터의 영속성을 보장하고 여러 컨테이너 간에 데이터를 공유 및 백업이 가능
데이터 퍼시스턴시(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 /" 초기 화면에 표시
마운트된 디렉토리 경로에 HTML 파일을 넣어 초기 화면을 실시간으로 변경
#nano 텍스트 에디터를 사용 '~/apa_folder' 디렉토리에 새로운 HTML 파일 생성
nano ~/apa_folder/index.html
- 작성 후 변경 사항 저장 에디터 종료
<html>
<meta charset="utf-8"/>
<body>
<div> 안녕하세요! </div>
</body>
</html>
웹 브라우저에서 로컬호스트와 지정된 포트 번호로 접속하여 업데이트된 초기 화면을 확인
볼륨 마운트 실습
- 볼륨 생성 후 컨테이너의 내부 경로와 마운트 및 초기 화면 변경
#볼륨 생성
docker volume create apa000vol1
#볼륨을 마운트하는 아파치 컨테이너를 생성
docker run --name apa000ex21 -d -p 8091:80 -v apa000vol1:/usr/local/apache2/htdocs httpd
#볼륨 상세 정보 확인
docker volume inspect apa000vol1
#컨테이너 상세 정보 확인
docker container inspect apa000ex21
#볼륨 경로에서 '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>
웹 브라우저에서 로컬호스트와 지정된 포트 번호로 접속하여 업데이트된 초기 화면을 확인
도커 이미지 생성
컨테이너에서 이미지를 추출해 생성 실습
#아파치 컨테이너 생성
docker run --name apa000ex22 -d -p 8092:80 httpd
#컨테이너에서 현재 실행 중인 상태를 그대로 새로운 이미지로 생성
#docker commit [컨테이너_이름] [새로운_이미지_이름]
docker commit apa000ex22 ex22_original1
#이미지 목록 확인
docker image ls
Dockerfile
- 도커 이미지를 빌드하기 위한 텍스트 기반의 스크립트 또는 설정 파일
- docker 스크립트를 재료 폴더에 컨테이너에 넣을 파일과 함께 두어 이미지 생성
- docker build -t ex22_original2 [재료_폴더_경로]
Dockerfile로 이미지 생성 실습
#Dockerfile을 홈 디렉토리 아래 'apa_folder' 디렉토리에 생성
nano ~/apa_folder/dockerfile
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
#이미지 목록 확인
docker image ls
#생성 이미지로 컨테이너 생성
docker run --name ex22 -d -p 8099:80 ex22_original2웹 브라우저에서 로컬호스트와 지정된 포트 번호로 접속하여 업데이트된 초기 화면을 확인
컨테이너 개조
- 컨테이너를 실행 중인 상태에서 컨테이너 내부의 파일 시스템, 환경 변수, 네트워크 설정 등을 변경하는 작업
컨테이너를 개조하는 방법
- 마운트와 파일 복사를 이용
- 컨테이너에서 리눅스 명령어 실행
컨테이너에서 명령어를 실행하려면 셸이 필요
- 컨테이너는 가장 일반적으로 사용되는 셸인 '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