Docker 실습

songtofu·2022년 4월 15일
0

Docker

목록 보기
3/6

1. Docker Run(실행)

1. docker container run
2. docker run
-> docker container run [옵션] 이미지명[:태그명][인수]

명령어 실행 과정

옵션

  1. -i, --interactive=false : interactive 모드(대화형 모드) -> 표준입력과 표준출력을 키보드와 화면을 통해 가능하도록 함.
  2. -t, --tty=false : tty 모드 -> 텍스트 기반의 터미널을 애뮬레이션(Emulation)해주는 옵션.
    +) Emulation : 어떤 특정한 기능을 하는 장치를 다른 기종의 장치에서 구현하는 것 = 한 컴퓨터를 다른 컴퓨터와 똑같이 동작할 수 있게 프로그래밍하여 그 기능을 그대로 사용할 수 있게 하는 것
  3. --name : 컨테이너에 이름을 설정
  4. -p, --publish=[] : 호스트에 연결된 컨테이너의 특정 포트를 외부에 노출. 보통 웹 서버의 포트를 노출할 때 주로 사용.
    • <호스트 포트>:<컨테이너 포트>
    • <IP 주소>:<호스트 포트>:<컨테이너 포트> 호스트에 네트워크 인터페이스가 여러 개 이거나 IP주소가 여러 개 일 때 사용.
    • <IP 주소>::<컨테이너 포트> 호스트 포트를 설정하지 않으면 호스트의 포트 번호가 무작위로 설정
    • <컨테이너 포트> 컨테이너 포트만 설정하면 호스트의 포트 번호가 무작위로 설정.
  5. --rm : 컨테이너를 일회성으로 실행할 때 주로 쓰인다. 컨테이너가 종료될 때 컨테이너와 관련된 리소스(파일 시스템, 볼륨)까지 깨끗이 제거.
  6. -v : 호스트와 컨테이너 간의 볼륨(volumn) 설정을 위해서 사용. 호스트 컴퓨터의 파일 시스템의 특정 경로를 컨테이너의 파일 시스템의 특정 경로로 마운트 해준다.
  7. --link : 컨테이너끼리 연결합니다. <컨테이너 이름>:<별칭> 형식

nginx 컨테이너 실행

  • nginx를 docker로 실행하는 방법
docker run -it nginx

nginx 컨테이너 실행 + Host 8080 port 연결

docker run -it -p 8080:80 nginx
  • nginx 컨테이너 실행 + Host 8080 port 연결 + 종료시 자동삭제
  • [주소][localhost:8080]으로 접속하면 nginx 페이지가 나온다.

+) nginx에 대한 공부하기

2. Docker Build

  • Dockerfile로 이미지를 생성하는 build 명령
  • 보통 Dockerfile이 있는 경로에서 docker build 명령을 실행합니다. Dockerfile 있는 특정 경로를 설정할 수도 있다.
docker build <옵션> <Dockerfile 경로>

옵션

  1. -t, --tag=””: 저장소 이름, 이미지 이름, 태그를 설정합니다. <저장소 이름>/<이미지 이름>:<태그> 형식

3. Docker stop

docker stop <컨테이너 ID> 
  • 해당 컨테이너 종료 ( 하고있는 작업을 마무리하고 꺼짐. 시간이 좀 걸린다. )

4. Docker kill

docker kill <컨테이너 ID>
  • 해당 컨테이너 강제 종료 ( 바로 꺼짐 )

5. docker-compose.yml 예제 이해하기

참고 예제 :: docs.docker.com

  • docker-compose.yml 파일을 설정 파일로 사용하는데 일반적으로 프로젝트 최상위 디렉토리에 위치

yaml이란?

  • 데이터를 교환할 때 사용되는 데이터 형식 ex) XML, JSON
//docker-compose.yml = .yaml (Dos 시절 확장자를 3자로 제한하던 시절이 있다고 한다. 이 때 사용하기 위해 yaml 확장자를 yml으로 줄여서 사용)

version: "3" 					# docker-compose version 명시
    
services: # 서비스 정의
  db: 							# Container
    image: mysql:5.7			# Container 올릴 때 사용할 image
    volumes:					# 어디에 설치?
      - db_data:/var/lib/mysql
    restart: always				# Container 종료 전까지 항상 재시작
    environment:				# 환경변수
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
    
  wordpress:
    depends_on:					# Container 간 종속 설정
      - db
    image: wordpress:latest
    volumes:
      - wordpress_data:/var/www/html
    ports:						# 포트 설정
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
volumes:
  db_data: {}
  wordpress_data: {}

간단한 yaml 문법

  • #은 주석

자료형

  • 스칼라(Scalar) : String 혹은 숫자
  • 스퀀스(Sequence) : 배열 혹은 리스트
  • 매핑(Mapping) : 해시 혹은 딕셔너리, key-value 쌍

object 표현

key: 
  key: value
  key: value

# 또는

key: {
  key: value,
  key: value
}

list 표현

key:
  - item
  - item

# 또는

key: [
  item, item
]

주의사항

  • keyvalue 사이에 반드시 빈칸이 필요하다.
# error (not key-value, string)
key:value

# ok
key: value

docker-compose.yaml 간단한 항목 설명

  • docker-compose.yml에 정의되어 있는 각각의 서비스는 특정의 image 혹은 build를 지정할 필요가 있다. 그 외의 키는 옵션이므로, docker run 커맨드 라인과 유사
  • docker run과 동일하게, Dockerfile로 지정된 옵션이 디폴트

image

  • 태그나 image ID의 일부이다. 로컬이라도 리모트라도 관계없다. 로컬에 존재하지 않으면, Compose는 이미지를 pull한다.

build

  • Dockerfile의 어떤 디렉토리 패스를 지정한다. 이 값이 상응하는 경로로 지정된 경우 yml파일 자체가 있는 장소로부터의 상대패스가 된다. 또한, 디렉토리는 내용 구축을 위해, Docker 데몬에도 보내진다.
    -Compose는 구축시, 생성된 이름을 태그 붙여 이후의 이미지에도 사용된다.

Dockerfile

  • 대체용 Dockerfile이다. Compose는 구축시에 지정된 파일을 사용

command

  • 디폴트의 커맨드를 덮어쓴다.

ports

  • 포트를 공개(expose)한다. 호스트와 포트를 지정(호스트:컨테이너)하던가, 컨테이너의 포트만 지정한다(호스트쪽의 포트는 랜덤으로 선택된다).
    주의 : 포트의 매핑에 호스트:컨테이너 형식을 사용할 때, 컨테이너의 포트가 60이하인 경우는 ERROR가 표시된다. 이것은 ytml가 xx:yy형식의 60진수로 인식하기 때문이다. 따라서 항상 명확한 포트의 맵핑을 문자열로 지정하는 것을 추천한다.

expose

  • 호스트 머신상에 포트를 노출(expose)하지만, 공개되지는 않는다. 링크된 서비스만 액세스 할 수 있다. 내부 포스만 지정할 수 있다.
  • 컨테이너를 다른 서비스에 링크한다. 서비스명과 링크/에일리어스(alias)를 지정할 수 있을 뿐만 아니라, 혹은 서비스명(에일리어스로써도 사용될 수 있다)에서도 지정할 수 있다.

volumes

  • 패스와 볼륨으로써 마운트한다. 옵션으로써 호스쪽의 경로를 지정 (호스트:컨테이너)하거나, 액세스 모드를 지정한다(호스트:컨테이너:ro).

environment

  • 환경변수를 추가한다. 배열이나 dictionary(YAML의 배쉬)를 사용할 수 있다.
  • 키뿐인 환경변수는 Compose 실행시에 사용되는 값에 해당하므로, 비밀로하고 싶은 값이나 호스트 고유의 값을 지정하기 쉽다.

env_file

  • 파일로부터 환경변수를 추가한다. 리스트에는 1개의 값이다. Compose로 파일을 docker-compose -f 파일명으로 지정한 경우는, env_file의 경로는 그 파일이 있는 디렉토리로부터의 상대경로가 된다.
  • compose는 환경변수로 지정된 파일의 각 행이 변수 = 값의 형식으로 간주한다. #으로 시작하는 행은 무시되어(예:코멘트), 빈 여백의 행으로 다뤄진다.
RACK_ENV=development

docker-compose 실행, 종료

  • wordpress의 docker-compose.yml 파일이 있는 곳에서 docker-compose up 명령어를 실행 -> 컨테이너들을 생성하고 시작할 수 있다.
  • --build 옵션 : services들을 빌드 할 수 있다.
  • -d 옵션 : 데몬 환경으로 동작하도록 할 수 있다.

+) 데몬 환경?

6. Container에 접속하기

docker 명령어로 접속

  1. docker ps로 컨테이너 리스트들을 볼 수 있다.
  2. docker exec -it <컨테이너 ID> /bin/bash 명령어를 사용, <컨테이너 ID> 인 컨테이너의 bash쉘을 실행시킴으로써 접근

docker-compose 명령어로 접속

1.docker-compose exec mariadb /bin/bash 명령어를 사용, 서비스명이 mariadb인 컨테이너의 bash쉘을 실행시킴으로써 접근.
docker-compose.yml파일이 존재하는 곳에서만 위 명령어로 실행할 수 있다.

services:
	mariadb: #services 명
    	image: debian:buster

7. MariaDB 설치

  • mariadb 컨테이너는 3306 포트로 DB서버를 제공해야 함.
    이유 : 환경 설정 정보가 저장되어 있는 기존 파일에 port = 3306으로 설정되어 있기 때문.

7.1) mariadb 서비스 컨테이너에 접근

docker-compose exec mariadb /bin/bash
root@0ba436eccbc5:/#

7.2) mariadb-server 설치

root@0ba436eccbc5:# apt-get update -y && //패키지 정보 업데이트 
apt-get upgrade -y && // 설치된 패키지 업그레이드
apt-get -y install mariadb-server // mariadb-server 설치

7.3) mariadb-server 설정 & 시작

root@0ba436eccbc5:# apt-get install -y vim // vim 설치
root@0ba436eccbc5:# vim /etc/mysql/mariadb.conf.d/50-server.cnf // vim을 이용해 .cnf파일 수정
  • mariadb서버의 bind-address주소를 주석처리한다. (이를 해주지 않을 경우 외부 ip에서 접근할 수 없게 된다.)
root@0ba436eccbc5:# service mysql start [ ok ] Starting MariaDB database server: mysqld.

7.4) wordpress에서 사용할 유저 & DB 생성

root@0ba436eccbc5:# mysql
MariaDB [(none)]> CREATE DATABASE wordpress_db;
  • mysql 접속, wordpress_db 생성
1. CREATE USER 'yejsong'@'%' IDENTIFIED BY 'password';
2. GRANT ALL ON wordpress_db.* TO 'yejsong'@'%';
3. FLUSH PRIVILEGES;
  1. 유저의 아이디와 패스워드 생성
  2. wodrpess_db의 모든 테이블을 어디에서든 접속할 수 있게 설정
  3. 보통 db에서 mysql(mariadb)의 환경 설정을 변경할 경우 FLUSH PRIVILEGES 라는 명령어를 입력한다. 이 명령어의 뜻은 현재 사용중인 mysql의 캐시를 지우고 새로운 설정을 적용하기 위해 사용. (이 명령어를 사용하려는 사용자는 reload 권한을 가지고 있어야한다.)
    -> MySQL의 재시작 없이 변경한 설정부분을 적용할 때 사용.
    -> 데이터베이스의 TABLE의 추가, 삭제 등의 변경은 MySQL 환경 설정이 아니므로 해당 명령어가 필요가 없습니다.
    하지만 id, 패스워드가 추가 & 수정 되었을 경우, 환경 설정이 변경되었기에 해당 명령어가 필요합니다.

7.5) MariaDB 서버 접속이 잘 되는지 확인하기

MariaDB [(none)]> exit
Bye // mysql 서버에서 나오기.

root@0ba436eccbc5:# hostname -i
172.25.0.3 // mariadb 컨테이너의 ip주소 확인. (실습환경에 따라 다름)

root@0ba436eccbc5:# exit // mariadb컨테이너 빠져나오기
docker-compose exec wordpress /bin/bash // wordpress 컨테이너 접속

root@487d0433b6c9:/# apt-get update -y &&
apt-get upgrade -y && 
apt-get -y install mariadb-client
root@8b41a90ef8e8:/# mysql -u 유저_이름 -ppassword -h mariadb_컨테이너_ip주소

Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 40
Server version: 10.3.27-MariaDB-0+deb10u1 Debian 10

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

8. Wordpress 환경 설정

  • wordpress 컨테이너는 9000포트로 php-fpm 서버를 제공해야함.

8.1) wordpress 서비스 컨테이너에 접근

$ docker-compose exec wordpress /bin/bash

8.2) wordpress 컨테이너에 필요한 패키지 설치

root@8b41a90ef8e8:/# apt-get update -y &&
apt-get upgrade -y && 
apt-get -y install php7.3 php-fpm php-cli wget curl php-mysql php-mbstring php-xml sendmail vim
  • php7.3
  • php-fpm : 요청마다 이미 생성한 프로세스를 재활용함으로써, 빠르게 동작하는 CGI(Common Gateway Interface).

    CGI?
    로그인과 게시글 등록을 하기위해서는 동적인 페이지 구현이 필요하다.
    또 동적인 페이지를 구현하기위해서는 웹서버 이외의 외부 프로그램에서 처리하는 방법을 사용한다. 웹서버에서 요청을 받아 그 요청을 외부 프로그램에 넘겨주면, 외부 프로그램은 프로그램 파일을 읽어 html로 반환하는 단계를 거치게 된다. 이것을 CGI 라고 한다.

  • php-cli : PHP 명령줄 인터페이스의 줄임말, 시스템 명령 줄에서 php를 사용하는 방법 또는, 웹서버에 없는 php스크립트를 실행하는 방법.
  • wget : Wget(간단히 Wget, 이전 이름: Geturl)는 웹 서버로부터 콘텐츠를 가져오는 컴퓨터 프로그램
  • curl
  • php-mysql
  • php-mbstring
  • php-cml
  • sendmail

8.3) wordpress 다운

1. wget https://wordpress.org/latest.tar.gz &&
2. tar -xvf latest.tar.gz &&
3. mv /wordpress/* /var/www/html/ &&
4. chown -R www-data:www-data /var/www/html &&
5. rm -r /wordpress latest.tar.gz
  1. wget을 이용해 wordpress latest버전을 다운
  2. 압축을 푼다. (-xvf 명령어 옵션 = tar 아카이브를 현재 디렉토리에 풀기) 자세한 옵션은 tar --help로 확인 가능
  3. /var/www/html/ 에 이동
  4. 파일 소유권 변경 (-R 옵션 = 하위 파일과 폴더들에 한번에 적용) 자세한 것
  5. 압축해제 전 파일 삭제

+) 4번 과정은 뭐하는 과정일까,,,?

root@8b41a90ef8e8:/# ls -l /var/www/html/
total 212

<어쩌고 저쩌고>

8.4) wp-config.php 파일 수정

root@8b41a90ef8e8:/# mv /var/www/html/wp-config-sample.php /var/www/html/wp-config.php

wp-config-sample.php 파일을 wp-config.php로 변경

root@8b41a90ef8e8:/# vim /var/www/html/wp-config.php

wp-config.php 수정

+) 수정하는 과정 사진 필요

8.5) php fpm 설정 파일 수정

root@8b41a90ef8e8:/# vim /etc/php/7.3/fpm/pool.d/www.conf

php fpm을 실행시키기 전 외부에서 php fpm서비스에 접속할 수 있게 해주어야 한다.

www.conf 파일의 listen을 0.0.0.0:9000으로 수정&저장.

8.6) php fpm 서비스 시작

service php7.3-fpm start

root@8b41a90ef8e8:/# hostname -i
wordpress_컨테이너_주소

wordpress컨테이너 주소 = nginx에서 php-fpm서버에 접근할 때 필요함.

9. Nginx 환경 설정

9.1) nginx 서비스 컨테이너 접속

$ docker-compose exec nginx /bin/bash

9.2) nginx에 필요한 패키지 설치

root@3652dd165a94:/# apt-get update -y &&
apt-get upgrade -y &&
apt-get -y install nginx openssl vim
  • openssl : 443 포트로 https 통신을 하기 위해 self-signed SSL 인증서를 생성하기 위해 설치

9.3) self-signed ssl 인증서 생성

root@3652dd165a94:/# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -subj "/C=KR/ST=Seoul/L=Seoul/O=42Seoul/OU=Song/CN=localhost" -keyout /etc/ssl/private/server_pkey.pem -out /etc/ssl/certs/server.crt
  • req : 인증서명요청 또는 인증서를 만드는 커맨드
  • newkey rsa:2048 : rsa 방식을 이용해 개인키와 인증서명 요청을 새로만든다. 2048 bit 사이즈의 키가 생성된다.
  • days 365 : 유효일수
  • nodes : no des 를 줄인 것으로, 개인키를 비밀번호로 보호하고싶지 않을 때 사용. 이 옵션을 생략하면 매번 비밀번호 입력해야함.
  • x509 : 이 옵션을 사용하면 인증서명요청 대신 Self Signed 인증서를 생성한다.
  • subj "/C=KR/ST=Seoul/L=Seoul/O=42Seoul/OU=Song/CN=localhost" : 인증서 안에 들어갈 정보를 명시해주는 부분
  • keyout <개인키 이름> : -keyout localhost.dev.key
  • out <인증서 이름> : -out localhost.dev.crt
    +) ssl 인증서

9.4) default 파일 수정

root@3652dd165a94:/# vim /etc/nginx/sites-available/default
server {
	listen 443 ssl;
	ssl_protocols  TLSv1.2 TLSv1.3;
    
	ssl_certificate /etc/ssl/certs/server.crt;
	ssl_certificate_key /etc/ssl/private/server_pkey.pem;

	root /var/www/html;

	index index.php index.html index.htm;

	server_name _;

	location / {
		try_files $uri $uri/ =404;
	}

	location ~ \.php$ {
		include snippets/fastcgi-php.conf;
        
		# fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name;
		fastcgi_pass wordpress_컨테이너_주소:9000;
	}
}

+) 파일에 대해 공부하기

9.5) nginx 서비스 시작

root@3652dd165a94:/# service nginx start
[ ok ] Starting nginx: nginx.

https://127.0.0.1로 접근하면 된다.
크롬 브라우저로 접근이 안된다면, 빈 곳을 클릭 후 thisisunsafe라고 입력하면 된다.

https://127.0.0.1/index.php로 접근하면 설치 페이지로 리다이렉션

출처

profile
읽으면 머리에 안들어와서 직접 쓰는 중. 잘못된 부분 지적 대환영

0개의 댓글