도커(Docker)와 가상머신(VM)은 애플리케이션의 배포와 실행을 위한 컴퓨팅 환경을 구축하는 데 사용되는 기술이다.
도커는 가상머신보다 가볍고 효율적인 애플리케이션 실행 환경을 제공하며, 개발과 배포의 편의성을 높여준다는 장점이 있고, 가상머신은 더 강력한 격리와 다양한 운영체제 환경을 지원한다는 장점이 있다.
도커(Docker)는 애플리케이션을 컨테이너화하여 패키징, 배포, 실행할 수 있는 플랫폼다. 도커 컴포즈(Docker Compose)는 다중 컨테이너 도커 애플리케이션을 정의하고 관리하는 도구다.
도커와 도커 컴포즈는 컨테이너화를 통해 애플리케이션과 종속성을 포함하는 이식성이 좋고 격리된 환경을 제공함으로써 애플리케이션을 패키징하고 관리하는 강력한 조합이다. 도커 이미지와 컨테이너를 사용하여 애플리케이션을 간편하게 구축하고 실행할 수 있으며, 도커 컴포즈를 사용하여 다중 컨테이너 애플리케이션의 구성과 종속성을 관리할 수 있다.
docker-compose.yml을 작성하기 전 compose file document 를 정독했다..
docker-compose.yaml
와 docker-compose.yml
이 둘 다 있는 경우 compose.yaml파일을 선호한다.사용할 만한 element
target
defines the stage to build as defined inside a multi-stage Dockerfile
.
# Dev-ready container - actual files will be mounted in
FROM --platform=$BUILDPLATFORM base AS dev
CMD ["mkdocs", "serve", "-a", "0.0.0.0:8000"]
# Do the actual build of the mkdocs site
FROM --platform=$BUILDPLATFORM base AS build
COPY . .
RUN mkdocs build
compose파일 내에서 이미지 이름 지정하는 법
[’명령어’, ‘인자’, ‘인자’, …]
ENTRYPOINT ["/bin/bash"] 해서 실행시키면 컨테이너 환경에서 bash를 사용해볼 수 있다!
docker run -it [image_name]
-i : iteractive
-t : tty
CMD ["executable","param1","param2"]
(exec form, this is the preferred form)CMD ["param1","param2"]
(as default parameters to ENTRYPOINT)CMD command param1 param2
(shell form)single Dockerfile build
docker build [--tag image_name]
run image
docker run [-옵션 .]
container 죽이기
docker container kill [container id]
docker rm -f $(docker ps -qa)
docker network ls
docker network inspect [network 이름]
compose 사용을 안하면 빌드/실행시킬때마다 아래처럼 정보를 다 적어줘야한다..
docker run -d -p 80:80 -v ./app:/var/www/html nginx sleep infinity
docker run -d -p 9000:9000 -v ./app:/var/www/html wordpress sleep infinity
docker run -d --expose 3306 mariadb sleep infinity
expose, ports 차이
expose :
ports:
compose up 할 때 'not found' 에러 발생, 싱글 도커파일 빌드할 때는 잘 됐음
Avoid storing application data in your container’s writable layer using storage drivers. This increases the size of your container and is less efficient from an I/O perspective than using volumes or bind mounts.
Start with an appropriate base image. For instance, if you need a JDK, consider basing your image on the official openjdk image, rather than starting with a generic ubuntu image and installing openjdk as part of the Dockerfile.
라고 돼있지만 서브젝트에서 이미지는 os만 허용해줘서 debian위에 쌓아야한다..
reduce the number of layers in your image by minimizing the number of separate RUN
commands in your Dockerfile.
RUN apt-get -y update
RUN apt-get install -y python
RUN apt-get -y update && apt-get install -y python
밑 코드가 더 적은 layer를 쌓는다.
볼륨 설정하는 4가지 방법
mysql command line option
prompt로 쿼리 날리기
mysql -u [ID] -p [PW] < [FILENAME]
mysql query
mysqld = mysql + daemon = 백그라운드에서 실행되는 프로세스
(이것뿐만 아니라 d가 붙은 건 웬만하면 다 daemon이었다..)
웹사이트를 만들고 관리하기 위한 도구로 사용되는 오픈 소스 기반의 웹 콘텐츠 관리 시스템(Content Management System, CMS)이다.
PHP-FPM은 PHP FastCGI Process Manager의 약자로, PHP 언어를 실행하는 데 사용되는 프로세스 관리자입니다.
워드프레스(WordPress)는 PHP로 작성된 오픈소스 웹 콘텐츠 관리 시스템(CMS)이며, PHP-FPM은 워드프레스와 함께 사용되는 일반적인 실행 환경입니다. PHP-FPM은 FastCGI 프로토콜을 통해 웹 서버와 통신하여 PHP 파일을 처리합니다.
PHP-FPM은 워드프레스와 같은 동적인 웹 애플리케이션을 실행하기 위해 필요한 기능을 제공합니다. 이를 통해 PHP 코드를 처리하고 결과를 웹 서버에 반환하는 역할을 합니다. 또한, PHP-FPM은 웹 서버와 독립적으로 실행되며, 요청에 따라 자동으로 PHP 프로세스를 생성하고 관리하여 웹 애플리케이션의 성능과 확장성을 향상시킵니다.
워드프레스와 함께 PHP-FPM을 사용하면 웹 서버와 PHP 실행 환경을 분리하여 보다 효율적인 웹 애플리케이션 운영이 가능해집니다.
WordPress는 PHP와 MySQL을 기반으로 작동한다. PHP는 서버 측 스크립팅 언어로, 웹페이지를 동적으로 생성하고 데이터베이스와 상호작용하는 데 사용된다. MySQL은 데이터베이스 관리 시스템으로, 웹사이트의 내용과 설정을 저장한다.
wp-cli를 이용해 core(wordpress)를 다운받는다.
wp core download --path=${WP_PATH} --allow-root
연결할 database의 정보를 전달하여 config파일을 생성한다.
wp config create --dbname=${DB_NAME} --dbuser=${DB_USER_NAME} --dbpass=${DB_USER_PASSWD} --dbhost=${DB_HOST} --path=${WP_PATH} --allow-root --skip-check
url을 이용하여 database에 wordpress table을 생성한다.
wp core install --url=${WP_URL} --title=${WP_TITLE} --admin_user=${ADMIN_NAME} --admin_password=${ADMIN_PASSWD} --admin_email=${ADMIN_EMAIL} --allow-root --path=${WP_PATH}
새로운 유저를 생성한다.
wp user create ${USER_NAME} ${USER_EMAIL} --user_pass=${USER_PASSWD} --allow-root --path=${WP_PATH}
NGINX는 오픈 소스 웹 서버 소프트웨어이다.
NGINX의 주요 특징
모듈화된 아키텍처를 가지고 있어 확장성과 유연성이 높다.
OpenSSL은 오픈 소스로 개발된 암호화 라이브러리입니다. OpenSSL은 SSL(보안 소켓 레이어) 및 TLS(전송 계층 보안) 프로토콜을 구현하고, 네트워크 통신에서 데이터의 기밀성과 무결성을 제공하기 위해 사용됩니다.
OpenSSL은 암호화, 복호화, 디지털 서명, 인증서 생성 및 관리 등 다양한 암호 기능을 제공합니다. 이러한 기능은 네트워크 통신, 웹 서버, 이메일 서버 등 다양한 보안 요구에 활용될 수 있습니다.
OpenSSL은 C 언어로 작성되어 있으며, 대부분의 유닉스 및 윈도우 운영 체제에서 사용할 수 있습니다. 또한 OpenSSL은 많은 애플리케이션과 시스템에서 기본적으로 사용되는 암호화 도구입니다. 예를 들어, 웹 서버인 Apache나 Nginx에서 SSL/TLS 암호화를 위해 OpenSSL을 사용합니다.
또한 OpenSSL은 커맨드 라인 도구로도 제공되어, 인증서 생성, 디지털 서명 검증, 암호화된 데이터의 복호화 등을 수행할 수 있습니다.
OpenSSL은 오픈 소스로 개발되었기 때문에 소스 코드를 검토하고 수정할 수 있으며, 안정성과 보안성을 높일 수 있습니다.
Transport Layer Security의 줄임말. TLS는 암호화와 인증을 통해 인터넷 통신의 보안을 제공하는 프로토콜이다. SSL(Secure Sockets Layer) 프로토콜의 후속 버전이다.
TLS는 웹사이트의 HTTPS(보안 HTTP) 연결에서 가장 널리 사용되는 프로토콜이다. 또한, 이메일 보호, VPN(Virtual Private Network) 연결, 메시징 애플리케이션 등 다양한 통신 프로토콜에서 사용되어 데이터의 보안성을 제공한다.
conf파일을 어떤 이름으로 복사해야할까..
nginx.conf로 하면 event가 없다느니, http블록에 넣으라느니 여러 에러가 뜬다.
알고보니 이미 존재하는 nginx.conf에 필수로 있어야하는 부분이었고 내가 부족한 파일로 덮어씌워 없애버린거였다..!
파일 내부를 확인해보니 nginx/nginx.conf파일에서는 /etc/nginx/conf.d/*.conf 를 인클루드하고있었다.
그래서 내가 작성한 conf파일은 conf.d폴더 안에 아무이름으로 넣어주면 nginx.conf파일에 포함되게 된다.
맘편하게 이 방법을 사용했다.
chown a b
chown a:b c
pid1의 역할
docker 내부 프로세스가 pid 1 프로세스일 때 문제점
일반 프로세스들은 term 시그널에 대한 기본 동작으로 종료하기 전 clean up을 진행한다. 하지만 pid 1은 시그널 핸들러가 등록되어있지 않아 term에 어떠한 영향을 받지않는다. 시그널 핸들러를 등록해두지 않은 경우, 자식 프로세스가 하위 프로세스를 생성한 뒤 종료됐다면 고아 프로세스가 계속 생길 수 있다.
docker run이 systerm 을 수신하면 컨테이너가 죽지 않더라도 신호를 컨테이너로 전달할 후 종료되고, docker stop의, 경우 명령을 수신하면 term시그널을 보낸 후 10초를 기다린 다음 중지되지않으면 Kill을 전송하여 정리할 기회없이 즉시 중지된다.
이러한 문제를 해결하는 게 Dumb-init이다.
dumb-init을 사용하면 entrypoint로 등록한 프로세스가 pid 1이 아닌 dumb-init의 자식이 된다.
dumb-init은 모든 시그널에 대해 핸들러를 등록하고 해당 시그널을 프로세스 세션으로 전달한다. 등록한 프로세스는 pid 1이 아니라 term신호를 정상적으로 수신할 수 있게된다. dumb-init은 adopt도 하여 고아 프로세스를 거두는 역할도 하게된다.