๊ท์ฌ์ด Docker Logo!
๐ณ Docker๋!
Docker๋ Linux Container ๊ธฐ์ ์ ์ด์ฉํ์ฌ ๋ง๋ Container ๊ธฐ์ ์ค ํ๋!
๐ฆLinux Container ๊ธฐ์ ์ด๋?
Linux Container๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ๋ก์ธ์ค๋ฅผ ๊ฒฉ๋ฆฌ ์ํจ๋ค๋ ๊ฐ๋ ์์ ์ถ๋ฐ.
์๋ฅผ ๋ค์ด chroot
๋ช
๋ น์ด๋ ํ๋ก์ธ์ค๊ฐ ์ ๊ทผ ํ ์ ์๋ /
๊ฒฝ๋ก๋ฅผ ๋ณ๊ฒฝํ์ฌ ์ ๊ทผ ํ๋ ํ์ผ์ ๋ํด์ ์ ์ด ๊ฐ๋ฅ.
ํ์ง๋ง chroot
๋ช
๋ น์ด ๋ง์ผ๋ก๋ ๋คํธ์ํฌ ๋ฐ ํ๋ก์ธ์ค ๋ฑ์ ์ ํํ๊ธฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์ cgroups
๊ธฐ๋ฅ์ ์ด์ฉํ์ฌ ๊ฐ์ข
๋ฆฌ์์ค์ ๋ํด์ ์ ์ด๊ฐ ๊ฐ๋ฅ.
์์ ๊ฐ์ ๊ธฐ๋ฅ๋ค์ ์ด์ฉํ๊ณ ๋ฐ์ ์์ผ์ Linux Container ๊ธฐ์ ์ด ํ์๋จ.
Host์ ํ๋ก์ธ์ค, ๋ฆฌ์์ค ๊ฒฉ๋ฆฌ๋ฅผ ํตํ์ฌ ์ปจํ ์ด๋๋ก ๊ฐ๋ ํ๊ฒฝ์ ์์ฑ.
์ด๋ฅผ ํตํด ๊ฐ์ํ์ ๋ฌ๋ฆฌ ์ด์์ฒด์ ๋ฅผ ๊ฐ์ํ ํ๊ธฐ ์ํ ์์คํ ์ด ๋ณ๋๋ก ํ์๊ฐ ์๊ณ ๊ฒฉ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ Native ์์ค์ผ๋ก ์คํ์ด ๊ฐ๋ฅํจ.
Docker๋ฅผ ์ด์ฉํ๊ฒ ๋๋ฉด ์์ฉ ํ๋ก๊ทธ๋จ์ Host์ ๊ฒฉ๋ฆฌ๋์ด ์คํ์ด ๋๊ณ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ํ ํ๊ฒฝ ์ ์ฒด๊ฐ ๋ฏธ๋ฆฌ ์ด๋ฏธ์ง์ ๋ํด ์ ์๊ฐ ๋์ด ์คํ์ด ๋๊ธฐ ๋๋ฌธ์ host์ ํ๊ฒฝ๊ณผ ์๊ด์์ด ์ธ์ ๋ ๋์ผํ ์คํํ ์ ์๋ค!
๋ํ ๊ฐ์ํ์ ๋ฌ๋ฆฌ ๊ฒฉ๋ฆฌํ์ฌ ํ๋ก์ธ์ค๋ฅผ ์คํํ๋ ๊ฒ ์ด๊ธฐ ๋๋ฌธ์ ํ๋ฒํ ํ๋ก๊ทธ๋จ์ ์คํํ๊ณ ์ข ๋ฃํ๋ ๊ฒ๊ณผ ๊ฐ์ด ๋น ๋ฅธ ์คํ๊ณผ ์ข ๋ฃ๊ฐ ๊ฐ๋ฅํ๋ค.
์ ์ฅ์ ๋ค์ ํตํด์ ํ๋์ ์ด๋ฏธ์ง์์ ๊ฐ๋ฐ๊ณผ ํ ์คํธ ๋ฐฐํฌ ๋ชจ๋ ๊ฒ์ด ๋น ๋ฅด๊ณ ์ ์ํ๊ฒ ์ด๋ฃจ์ด ์ง ์ ์๋ค.
Docker๋ ๋๋ถ๋ถ์ ์ด์ ์ฒด์ ์์ ์ง์์ ํ๋ Linux Container ๊ธฐ์ ์ด๊ธฐ ๋๋ฌธ์ Linux ์ด์ธ์ ํ๊ฒฝ, Mac, Windows์์๋ VM์์์ ๋์ํ๊ฒ ๋๋ค.
๐ฟ Docker Image
Docker๋ ๋ง๋ค์ด์ง Container ํ๊ฒฝ ์ํ๋ฅผ Image๋ก ์ ์ฅ์ ํ ์ ์๋๋ก ์ง์์ ํ๋ค.
์ด๋ ๊ฒ ๋ง๋ค์ด์ง Docker Image๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ก์ด ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ฑฐ๋ ๋ค๋ฅธ ์๋ฒ์์ ๋์ผํ๊ฒ ์คํ์ด ๊ฐ๋ฅํ๋ค.
์ด๋ฌํ Docker Image๋ฅผ ์
๋ก๋ ํ์ฌ ๋ณด๊ดํ๊ณ ๋ฒ์ ๊ด๋ฆฌ ํ๋ ๊ณณ์ด ์๋๋ฐ ๊ทธ ๊ณณ์ registry
๋ผ๊ณ ํ๋ค.
๋ํ์ ์ธ registry๋ก Docker Hub๊ฐ ์๋ค.
๐ Dockerfile
Dockerfile์ image๋ฅผ ์์ฑํ๊ธฐ ์ํ Script ํ์ผ์ด๋ค.
Dockerfile์ Image๋ฅผ ๋ง๋ค๊ธฐ ์ํ ์์ ์ด ๊ธฐ์ฌ๋์ด ์๊ธฐ ๋๋ฌธ์ Build๊ฐ ๋๋ฉด ๋์ผํ Image๋ฅผ ๋ง๋ค์ด๋ด๊ฒ ๋๋ค.
์ด ์ ์ ์ด์ฉํ์ฌ ๋ฐฐํฌ ์์ Build ํ ๋์จ ๋ช ๊ธฐ๊ฐ ์ด์๋๋ ์ด๋ฏธ์ง๋ฅผ ์ด์ฉํ์ฌ ๋ฐฐํฌํ๊ธฐ ๋ณด๋ค๋ Dockerfile๋ฅผ ์ด์ฉํ์ฌ build ํ์ฌ ๋ฐฐํฌ๋ฅผ ํ๋ค.
๐Dockerfile ์์ฑ ๋ฌธ๋ฒ!
๐ FROM
๊ธฐ๋ณธ์ ์ผ๋ก Dockerfile์ ์ด๋ค ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ํ๋ ์ง์ ๋ํด์ ์ ์๋ฅผ ์์ํ๋ค.
# FROM <image-name>:<label>
FROM debian:buster
์์ ๊ฐ์ด FROM
๋ค์ ์ด๋ฏธ์ง์ ์ด๋ฆ์ด ์ค๊ณ ๊ทธ ๋ค์์๋ ์ด๋ฏธ์ง์ label์ด ์ค๊ฒ ๋๋ค.
์ฌ๊ธฐ์ ์ด๋ฏธ์ง๋ ๊ธฐ๋ณธ์ ์ผ๋ก **Docker Hub** ์ Alias๊ฐ ๋์ด ์์ด์ ๋ค๋ฅธ registry์์ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ ์ฌ ๋์๋ registry์ ์ ์ฒด url๋ฅผ ํฌํจํ์ฌ ์์ฑ์ ํด์ผ ํ๋ค.
๐ RUN
Dockerfile์์ ์ด๋ฏธ์ง ๋ด๋ถ์์ ์คํ ๋์ด์ผ ํ๋ ๋ช ๋ น์ด๋ฅผ ์์ฑ์ ํ ์ ์๋ค.
# RUN <command>
RUN apt update -y
์์ ๊ฐ์ด RUN
๋ค์ ์คํ์ด ํ์ํ ๋ช
๋ น์ด๋ฅผ ์์ฑ์ ํ์ฌ ์ฌ์ฉ์ ํ๋ค.
์ด๋ ์์ ๊ฐ์ด ์ฌ์ฉ ํ๋ ๋ฐฉ๋ฒ๋ง์ด ์๋ ๊ฒ์ด ์๋๋ผ ์ง์ ์คํ ๋์ด์ผ ํ๋ ๊ฒฝ๋ก๋ฅผ ์ง์ ์ ์ด ์ฃผ๋ ๋ฐฉ๋ฒ๊ณผ ์ธ์์ ๋ํด์ ํ์คํ๊ฒ arrayํํ๋ก ์ ์ ํด์ฃผ๋ ๋ฐฉ๋ฒ๋ ์กด์ฌ ํ๋ค.
RUN /bin/bash -c 'echo "Hello World!"'
RUN ["/bin/bash", "-c" "echo 'Hello World!'"]
์ด๋ ๋ช
๋ น์ด๋ฅผ ์คํํ ํ์ ๋ง๋ค์ด์ง๋ ์ด๋ฏธ์ง๋ฅผ ๋ ์ด์ด ๋ณ๋ก ์ ์ฅ์ ํ๊ฒ ๋์ด์ Dockerfile
์์ ์์ ์ ํ์ฌ๋ ์ด์ ๋ ์ด์ด๋ฅผ ํ์ฉํ์ฌ ๋น ๋ฅด๊ฒ ๋น๋๊ฐ ๊ฐ๋ฅํ๋ค.
๐ COPY
Docker image๋ฅผ ๋ง๋ค๋ฉด์ ๋ด๋ถ์ Sourcefile๋ฅผ ๋ณต์ฌํ์ฌ ์ด๋์ด ํ์ ํ ๋๊ฐ ์๋๋ฐ ์ด๋ฌํ ์ํฉ์์๋ ์๋์ ๊ฐ์ด ์ฌ์ฉ์ ํ ์ ์๋ค.
# COPY <src> <dst>
COPY init.sh /
๐ ADD
Dockerfile์๋ COPY
์ ์ ์ฌํ ์ฑ๊ฒฉ์ธ ADD
๋ช
๋ น์ด๊ฐ ์กด์ฌ๋ฅผ ํ๋ค.
ADD
๋ COPY
์ ๋ฌ๋ฆฌ ํ์ผ์ src ๋ถ๋ถ์ url๋ฅผ ์ ๊ฒ ๋๋ฉด ์๋์ผ๋ก ํ์ผ์ ๋ค์ด ๋ฐ์์ ๋ณต์ฌ๋ฅผ ํ๊ณ ์์ถ ํ์ผ์ ๊ฒฝ์ฐ์๋ ์์ถ์ ํด์ ํด์ ์ ๋ฌํ๊ฒ ๋๋ ํน์ง์ด ์กด์ฌํ๋ค.
# ADD <src(url)> <dest>
ADD <https://www.docker.com/sites/default/files/d8/2019-07/Moby-logo.png> /
์ด๋ฌํ ํน์ฑ์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์ COPY
์ ADD
๋ฅผ ์ ์ ํ ์ ํ์ ํ์ฌ์ ์ฌ์ฉ์ ํด์ผ ํ๋ค.
๐ ENV
Dockerfile์์๋ ๋ด๋ถ ์ด๋ฏธ์ง์์ ์ค์ ๋๋ ํ๊ฒฝ ๋ณ์์ ๋ํด์๋ ์๋์ ๊ฐ์ด ์ค์ ์ด ๊ฐ๋ฅํ๋ค.
# ENV name=value
ENV DEV_ENV=true
๐ WORKDIR
Dockerfile์์ ์์
ํ๋ ๊ฒฝ๋ก์ ๋ํด์ ์ ์๋ฅผ ํ ๋์๋ WORKDIR
๋ฅผ ์ด์ฉํ์ฌ ์ ์๋ฅผ ํ๊ฒ ๋๋ค.
# WORKDIR <dir>
WORKDIR /root
๐ USER
WORKDIR
๋ฅผ ์ด์ฉํ์ฌ ์์
๊ฒฝ๋ก๋ฅผ ์ง์ ํ๋ ๊ฒ๊ณผ ๊ฐ์ด ์์
ํ๋ ์ฌ์ฉ์์ ๋ํด์๋ ์ ์๊ฐ ๊ฐ๋ฅํ๋ค.
# USER <user>[:<group>] | <UID>[:<GID>]
USER 0:0
๋จ ์ด๋ ์ฌ์ฉ ๋๋ user์ ๋ํด์๋ ๋ฏธ๋ฆฌ RUN
๋ฅผ ์ด์ฉํด์ user์ group๋ฅผ ์ถ๊ฐ๋ฅผ ํ๊ฑฐ๋ ์ด๋ฏธ์ง์ ๋ฑ๋ก์ด ๋ user์ฌ๋ง ์๋์ ํ๊ฒ ๋๋ค.
๐ RUN
RUN
๋ฅผ ํ ๋์ ์ฌ์ฉ์ด ๋๋ ๊ธฐ๋ณธ shell์ ๋ํด ์๋์ ๊ฐ์ด ์ ์๊ฐ ๊ฐ๋ฅ ํ๋ค.
# SHELL [<executable>, <parameters>]
SHELL ["/bin/bash", "-"]
๐ ARG
Dockerfile์ image๋ฅผ ๋ง๋ค์ด์ฃผ๋ script ์ด๋ฏ๋ก ๋์ ์ผ๋ก ํ ๋น์ด ๊ฐ๋ฅํ ARG
๋ฅผ ์ฌ์ฉ ๊ฐ๋ฅ์ ํ๋ค.
# ARG <name>[=<default value>]
ARG user=root
์ด๋ ARG
๋ช
๋ น์ด๋ก ์ ์ํ๊ฒ ๋ ํ๊ฒฝ ๋ณ์๋ ๋์ผํ ARG
๋ณ์๋ฅผ ์ฌ์ ์ ํ๋ค.
๋น๋ ํ ๋ ๋ง์ฝ arg์ ๊ฐ์ ๋ณ๊ฒฝํ๊ณ ์ถ๋ค๋ฉด ์๋์ ๊ฐ์ด ์ฌ์ฉ ํ๋ค.
$ docker build --build-arg user=jaeskim .
๋ง์ฝ ํ๊ฒฝ ๋ณ์๋ฅผ arg๋ฅผ ์ด์ฉํ์ฌ ์ฌ์ ์ ํ์ฌ ์ฌ์ฉ์ ํ๊ณ ์ถ๋ค๋ฉด ์๋์ ๊ฐ์ด ์ฌ์ฉ ํ ์ ์๋ค.
ARG TEST
ENV TEST=${TEST:-hello_world}
RUN echo $TEST
๐ EXPOSE
์ปจํ
์ด๋ ๋ด๋ถ์์ ๋คํธ์ํฌ ํฌํธ๋ฅผ ์์ ๋๊ธฐ ํจ์ Docker์๊ฒ ๋ฏธ๋ฆฌ ์๋ ค์ค ์ ์๋๋ฐ ์ด๋ EXPOSE
๋ช
๋ น์ด๋ก ์ค์ ํ๋ค.
# EXPOSE <port> | <port><protocol>
EXPOSE 80
EXPOSE 443/tcps
๊ธฐ๋ณธ์ ์ผ๋ก protocol์ ๋ํด์ ์ ์๋ฅผ ํ์ง ์๊ฒ ๋๋ค๋ฉด tcp๋ก ์๋์ ํ๊ฒ ๋๊ณ , ์ฌ๊ธฐ์ ์ ์๋ฅผ ํ์๋ค๊ณ ๋ฐ๋ก HOST์ port๊ฐ ์ฐ๊ฒฐ์ด ๋๋ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ run time์์ port binding ์์ ์ด ์ํ ๋์ด์ผ ํ๋ค.
๐ CMD, ENTRYPOINT
์ด์ Dockerfile
์์ ์ปจํ
์ด๋๊ฐ ์ฌ๋ผ๊ฐ๊ณ ์คํ์ด ๋ช
๋ น์ด์ ๋ํด์ ์ ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์ ๋ณธ๋ค.
CMD
, ENTRYPOINT
๋ผ๋ ๋ช
๋ น์ด๋ฅผ ์ด์ฉํ์ฌ ์ ์๋ฅผ ํ๊ฒ ๋๋๋ฐ ๊ฐ ๊ฐ ์ฌ์ฉ ํ ๋์ ๊ฐ์ด ์ฌ์ฉํ ๋์ ์์ ์ ํจ๊ป ์ฐจ์ด๋ฅผ ์์ ๋ณธ๋ค.
CMD ["echo", "hello"]
์์ ๊ฐ์ด ๋ง๋ค์ด์ง dockerfile๋ฅผ ๋น๋ ํ ์คํ์ ํ๊ฒ ๋๋ฉด echo hello
๊ฐ ์๋ ํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด ๋ docker run test:cmd echo hi
์ ๊ฐ์ด ๋ง์ง๋ง์ ์คํ ์ธ์๋ฅผ ์ ๋ฌ ํ๊ฒ ๋๋ฉด echo hi
๊ฐ ์คํ์ด ๋๊ณ inspect
๋ช
๋ น์ด๋ก ํ์ธ์ ํด๋ณด๋ฉด CMD
๋ถ๋ถ์ ์ ๋ณด๊ฐ ์๋ก ์ ์ํ ๋ด์ฉ์ผ๋ก ๋ณ๊ฒฝ์ด ๋์ด ์๋ ๊ฒ์ ๋ณผ ์ ๊ฐ ์๋ค.
์ด๋ฒ์๋ ENTRYPOINT
๋ช
๋ น์ด๋ฅผ ๋จ๋
์ผ๋ก ์ฌ์ฉ์ ํด๋ณธ๋ค.
ENTRYPOINT ["echo", "hello"]
์์ ๊ฐ์ด ์์ฑํ dockerfile๋ฅผ ๋น๋ ํ ์คํํ๋ฉด ๋น์ฐํ๊ฒ hello
๊ฐ ์ถ๋ ฅ์ด ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด ๋ docker run test:entrypoint echo world
๋ก ์คํ์ ํ๊ฒ ๋๋ฉด hello echo world
๊ฐ ๋์ค๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด๋ฌํ ๋์์ด ๋์จ ์ด์ ๋ฅผ inspect
๋ช
๋ น์ด๋ฅผ ํตํด ์์๋ณธ๋ค.
...
"Cmd": [
"echo",
"world"
],
"Image": "test:entrypoint",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": [
"echo",
"hello"
],
...
dcokerfile์์ ์์ฑ๋ ENTRYPOINT
๋ ์ฌ์ ์ ๋์ง ์๊ณ CMD
๋ถ๋ถ์ ์ฌ์ ์ ๋์์ง๋ง ENTRYPOINT
+ CMD
๋ถ๋ถ์ด ์ด์ด์ ธ์ ์๋์ ํ๋ค.
์ฆ ENTRYPOINT
์๋ ์๋น์ค๋ก ๋์๊ฐ๋ ์ดํ๋ฆฌ์ผ์ด์
์ผ๋ก ์ ์๋ฅผ ํ๊ณ CMD
๋ถ๋ถ์ ์ถ๊ฐ ์ ์ผ๋ก ์ธ์๋ฅผ ํตํด ์ ๋ณด๋ฅผ ์ ๋ฌ ํ๋ ํํ๋ก ๋ง๋ค์ด์ง๋ ๊ฒ์ด ๊ถ์ฅ ๋๋ค.
๐ VOLUME
Docker์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ด๋ฏธ์ง ๋ ์ด์ด์ ์ ์ฅ์ ํ๊ฒ ๋๋ฏ๋ก container๊ฐ ๋ด๋ ค๊ฐ๊ณ ์๋ก์ด ๊ฒ์ ์ฌ๋ฆด ๋๋ง๋ค ์ด๊ธฐ ์ค์ ๋ ๋ฐ์ดํฐ๋ก ์ด๊ธฐํ ๋๋ ํ๋ฐ์ฑ์ด๋ผ๋ ํน์ง์ ๊ฐ์ง๊ณ ์๋ค.
์ด๋ log file์ด๋ db์ ๊ฐ์ ๋ฐ์ดํฐ๋ ํ๋ฐ์ฑ์ด ์๋ ๋น ํ๋ฐ์ฑ์ผ๋ก ๊ด๋ฆฌ ๋์ด์ผ ํ๋ฏ๋ก ์๋์ ๊ฐ์ด ํน์ ํด๋๋ฅผ ๊ธฐ๋ณธ volume์ผ๋ก ์ ์ฅ์ ํ์ง ์๊ณ ๋ฐ๋ก ์ ์ฅ์ ํ ์ ์๋ค.
# VOLUME [<dir>]
VOLUME ["/data"]
๐ ONBUILD
๋ง์ฝ ๋ง๋ค์ด์ง image๋ฅผ ๊ฐ์ง๊ณ FROM๋ฅผ ํ ๋์ ๋ฏธ๋ฆฌ ์ํ ๋์ด์ผ ํ๋ ์์
์ด ์์ ๋ ONBUILD
๋ฅผ ์ฌ์ฉํ๋ค.
์๋ฅผ ๋ค์ด์ ์๋์ ๊ฐ์ด python build
์ ๊ด๋ จ๋ ์ด๋ฏธ์ง๋ผ๋ฉด FROM
์ผ๋ก ์ฌ์ฉํ๋ฉด build๋ฅผ ํ ๋ src ํ์ผ๋ค์ ๊ฐ์ ธ์ ์ฌ์ฉ์ ํ๊ฒ ๋ง๋ค ์ ์๋ค.
# ONBUILD <INSTRUCTION>
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
๐ STOPSIGNAL
๊ธฐ๋ณธ์ ์ผ๋ก Docker Container๋ฅผ ์ข
๋ฃํ๊ฒ ๋๋ฉด ๋ด๋ถ์์ ์๋ํ๋ ํ๋ก์ธ์ค์๊ฒ SIGTERM
๋ฅผ ๋ณด๋ด๊ฒ ๋๋๋ฐ ์ด ๋ ๋ณด๋ด์ง๋ SIGNAL์ ๋ํด์ ์ ์๊ฐ ๊ฐ๋ฅํ๋ค.
# STOPSIGNAL signal
STOPSIGNAL SIGKILL
๐ HEALTHCHECK
DockerContainer๊ฐ ์ฌ๋ผ๊ฐ์ ๋ ์ค์ ๋ก ํ๋ก์ธ์ค๊ฐ ์ ์์ ์ผ๋ก ๋์ ํ๋ ์ง์ ๋ํด์ Healthcheck๊ฐ ๊ฐ๋ฅํ๋ฐ ์ด๊ฒ์ ์๋์ ๊ฐ์ด ์ฌ์ฉํ๋ค.
# HEALTHCHECK [OPTIONS] CMD command
HEALTHCHECK --interval=5m --timeout=3s \\
CMD curl -f <http://localhost/> || exit 1
์ฌ๊ธฐ์ ์ฌ์ฉ ๋๋ ์ต์ ์ ์๋์ ๊ฐ์ด ์ฌ์ฉ์ด ๋๋ค.
-interval=DURATION
(default:30s
)-timeout=DURATION
(default:30s
)-start-period=DURATION
(default:0s
)-retries=N
(default:3
)
๐ LABEL
์์ฑ๋ image์ ๋ํด ์ฌ๋ฌ๊ฐ์ง ์ ๋ณด๋ฅผ ๋ด์ ๋์๋ ์๋์ ๊ฐ์ด ์ฌ์ฉ์ ํ๋ค.
# LABEL <name>=<value>
LABEL maintainer="jaeskim <jaeskim.student.42seoul.kr>"
๐ฅ docker ๋ช ๋ น์ด
docker๋ฅผ ๊ด๋ฆฌ ํ ๋ ์ฌ์ฉ๋๋ ๋ค์ํ ๋ช ๋ น์ด๊ฐ ์กด์ฌ ํ๋๋ฐ ๊ทธ ์ค ์์ฃผ ์ฌ์ฉ๋๊ณ ์ค์ํ ๋ช ๋ น์ด์ ๋ํด์ ์์ ๋ณธ๋ค.
์ต์ ์ด ๋ฐฉ๋ํ์ฌ ๋ชจ๋ ๋ด์ฉ์ ์ค๋ช ์ ๋ชปํ๋ฏ๋ก ํ์ํ ๊ธฐ๋ฅ์ด ์์ ๋์๋ reference site์์ ํ์ธ ํ์ฌ ์ฌ์ฉ์ ํ๋ค.
โ๏ธ build
build
๋ช
๋ น์ด๋ ๊ธฐ๋ณธ์ ์ผ๋ก Dockerfile
๋ฅผ ์ด์ฉํ์ฌ image๋ฅผ ๋ง๋ค ๋ ์ฌ์ฉ์ ํ๊ฒ ๋๋ค.
# docker build [OPTIONS] PATH | URL | -
$ docker build --tag test:v1 .
๊ธฐ๋ณธ์ ์ผ๋ก ์์ ๊ฐ์ ๊ตฌ์กฐ๋ก ์๋์ด ๋๋๋ฐ ์์ฃผ ์ฌ์ฉ ๋๋ ์ต์ ์ ๋ํด์๋ง ์ค๋ช ์ ํ๋ค.
-t
,--tag
name:tag ์ ๊ฐ์ ํํ๋ก ์ธ์๋ฅผ ์ฃผ๊ณ ์์ฑ๋๋ image์ tag๋ฅผ ์ง์ ํ๋ ์ต์ ์ด๋ค.-f
,--file string
ํน์ Dockerfile
๋ฅผ ์ง์ ํ์ฌ์ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค ๋ ์ฌ์ฉํ๋ค.--build-arg
Dockerfile์ ์ ์๋ ๋ณ์์ ๋ํด์ ๊ฐ์ ์ง์ ํ ๋ ์ฌ์ฉํ๋ค.--no-cache
build ํ ๋ cache๋ฅผ ๋จ๊ธฐ์ง ์๋๋ก ํ ๋ ์ฌ์ฉํ๋ค.
๐๐ปโโ๏ธ run
run
๋ช
๋ น์ด๋ ๋ง๋ค์ด์ง image๋ฅผ ๊ฐ์ง๊ณ ์คํ ํ ๋ ์ฌ์ฉ์ ํ๊ฒ ๋๋ค.
# docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
$ docker run -p 8080:80 -it --rm --name testserver test:v1 /bin/bash
๊ธฐ๋ณธ์ ์ผ๋ก ์์ ๊ฐ์ ๊ตฌ์กฐ๋ก ์๋์ด ๋๋๋ฐ ์์ฃผ ์ฌ์ฉ ๋๋ ์ต์ ์ ๋ํด์๋ง ์ค๋ช ์ ํ๋ค.
-p
,--publish
(hostport:containerport) container ๋ด๋ถ์ port์ host์ port๋ฅผ binding ํ ๋ ์ฌ์ฉ์ด ๋๋ค.-i
,--interactive
STDIN๋ฅผ container์ ์ฐ๊ฒฐ ํ์ฌ์ ๋์ ์ผ๋ก ๋ฐ์ ํ ์ ์๋๋ก ํ๋ค.-t
,--tty
tty์ฒ๋ผ ์๋ ํ ์ ์๊ฒ ํ๋ค.--rm
container๊ฐ ์ข ๋ฃ๋๋ฉด ์๋์ผ๋ก image๋ฅผ ์ง์์ฃผ๋ ์ต์ ์ด๋ค.-e
,--env
ํ๊ฒฝ๋ณ์๋ฅผ ์ ์ํ ๋ ์ฌ์ฉํ๊ฒ ๋๋ค.--name
์ปจํ ์ด๋ ์ด๋ฆ์ ์ ์ ํ๋ค.-d
,--detach
background๋ก container๊ฐ ๋์ํ๊ฒ ๋๊ณ ID๋ฅผ ์ถ๋ ฅํ๋ค.-v
,--volume
volume๋ฅผ ๋ง์ดํธ ์ํฌ ๋ ์ฌ์ฉํ๋ค.
โ stop
stop
๋ช
๋ น์ด๋ container๋ฅผ ์ค์ง ์ํฌ๋ ์ฌ์ฉํ๋ค.
# docker stop [OPTIONS] CONTAINER [CONTAINER...]
$ docker stop testserver
-t
,--time
STOPSIGNAL ์๊ทธ๋์ ๋ณด๋ด๊ณ ๋ช์ด๊ฐ ๋๊ธฐ๋ฅผ ํ ์ง ์ค์ ํ๋ ์ต์ ์ด๋ค.
๐ฌ start
start
๋ช
๋ น์ด๋ ๋ฉ์ถฐ์ง container๋ฅผ ๋ค์ ๋์ ์ํฌ ๋ ์ฌ์ฉํ๋ค.
# docker start [OPTIONS] CONTAINER [CONTAINER...]
docker start testserver
๊ธฐ๋ณธ์ ์ผ๋ก ์์ ๊ฐ์ ๊ตฌ์กฐ๋ก ์๋์ด ๋๋๋ฐ ์์ฃผ ์ฌ์ฉ ๋๋ ์ต์ ์ ๋ํด์๋ง ์ค๋ช ์ ํ๋ค.
-a
,--attach
stdout/stderr ์ฐ๊ฒฐ ํ๋ค.-i
,--interactive
STDIN๋ฅผ container์ ์ฐ๊ฒฐ ํ์ฌ์ ๋์ ์ผ๋ก ๋ฐ์ ํ ์ ์๋๋ก ํ๋ค.
โ๏ธ attach
attach
๋ช
๋ น์ด๋ ์คํ๋ container์ ํ๋ก์ธ์ค์ ์ฐ๊ฒฐ ํ ๋ ์ฌ์ฉ์ ํ๋ค.
# docker attach [OPTIONS] CONTAINER
docker attach testserver
์ด ๋ ์ ๋ฌ ์ฐ๊ฒฐํ๊ฒ ๋๋ ํ๋ก์ธ์ค๋ cmd, entrypoint๋ก ์ ์๋ ํ๋ก์ธ์ค ์ด๋ฏ๋ก ์ฌ๊ธฐ์ ctr-c
๋ฅผ ๋๋ฌ ์ข
๋ฃํ๋ฉด ์ปจํ
์ด๋๊ฐ ๋ฉ์ถ๋ฏ๋ก ctr-p
, ctr-q
๋ก deattach๋ฅผ ํ์ฌ ๋์ค๋ ๊ฒ์ด ๊ถ์ฅ์ด ๋๋ค.
๐ก exec
exec
๋ช
๋ น์ด๋ ์คํ๋ container์๊ฒ ํ๋ก์ธ์ค๋ฅผ ์คํ์ ์ํฌ ๋ ์ฌ์ฉ์ ํ๋ค.
# docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
docker exec -it testserver /bin/bash
๊ธฐ๋ณธ์ ์ผ๋ก ์์ ๊ฐ์ ๊ตฌ์กฐ๋ก ์๋์ด ๋๋๋ฐ ์์ฃผ ์ฌ์ฉ ๋๋ ์ต์ ์ ๋ํด์๋ง ์ค๋ช ์ ํ๋ค.
-d
,--detach
์คํํ ํ๋ก์ธ์ค์ ์ฐ๊ฒฐ ์ํค์ง ์๊ณ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ๋์ ํ๊ฒ ํ๋ค.-e
,--env
์ปจํ ์ด๋์๊ฒ ํ๊ฒฝ๋ณ์๋ฅผ ์ ๋ฌ.-i
,--interactive
STDIN๋ฅผ container์ ์ฐ๊ฒฐ ํ์ฌ์ ๋์ ์ผ๋ก ๋ฐ์ ํ ์ ์๋๋ก ํ๋ค.-t
,--tty
tty์ฒ๋ผ ์๋ ํ ์ ์๊ฒ ํ๋ค.-u
--user
์คํํ๋ ํ๋ก์ธ์ค์ ์ ์ ๋ฅผ ์ ์ ํ๋ค. <name|uid>[:<group|gid>]-w
,--workdir
์คํ๋๋ ์์ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๋ค.
๐ ps
ps
๋ช
๋ น์ด๋ continaer๋ก ๋ชฉ๋ก์ ํ์ธ ํ ๋ ์ฌ์ฉ์ ํ๋ค.
# docker ps [OPTIONS]
docker ps -a
๊ธฐ๋ณธ์ ์ผ๋ก ์์ ๊ฐ์ ๊ตฌ์กฐ๋ก ์๋์ด ๋๋๋ฐ ์์ฃผ ์ฌ์ฉ ๋๋ ์ต์ ์ ๋ํด์๋ง ์ค๋ช ์ ํ๋ค.
-a
,--all
๋ชจ๋ container ๋ชฉ๋ก์ ์ถ๋ ฅ! (๊ธฐ๋ณธ๊ฐ์ ์๋ ์ค์ธ continer๋ง ์ถ๋ ฅํจ)
๐ images
images
๋ช
๋ น์ด๋ images์ ๋ชฉ๋ก์ ํ์ธ๐ง๐ธ ํ ๋ ์ฌ์ฉ์ ํ๋ค.
# docker images [OPTIONS] [REPOSITORY[:TAG]]
docker images -a
๊ธฐ๋ณธ์ ์ผ๋ก ์์ ๊ฐ์ ๊ตฌ์กฐ๋ก ์๋์ด ๋๋๋ฐ ์์ฃผ ์ฌ์ฉ ๋๋ ์ต์ ์ ๋ํด์๋ง ์ค๋ช ์ ํ๋ค.
-a
,--all
๋ชจ๋ images ๋ชฉ๋ก์ ์ถ๋ ฅ! (๊ธฐ๋ณธ๊ฐ์ ์ค๊ฐ layer ๋จ๊ณ์ images๋ ์จ๊น)
๐จ inspect
inspect
๋ช
๋ น์ด๋ container object์ ์ ๋ณด๋ฅผ ์ถ๋ ฅ ํ ๋ ์ฌ์ฉํ๋ค.
# docker inspect [OPTIONS] NAME|ID [NAME|ID...]
docker inspect testserver
๊ธฐ๋ณธ์ ์ผ๋ก ์์ ๊ฐ์ ๊ตฌ์กฐ๋ก ์๋์ด ๋๋๋ฐ ์์ฃผ ์ฌ์ฉ ๋๋ ์ต์ ์ ๋ํด์๋ง ์ค๋ช ์ ํ๋ค.
-f
,--format
์ต์ ๊ณผ ํจ๊ป ์ฃผ์ด์ง template ํํ๋ก ์ถ๋ ฅ๋ฅผ ํ๋ค.
๐ rm
rm
๋ช
๋ น์ด๋ contiainer๋ฅผ ์ ๊ฑฐ ํ ๋ ์ฌ์ฉํ๋ค.
# docker rm [OPTIONS] CONTAINER [CONTAINER...]
docker rm testserver
๊ธฐ๋ณธ์ ์ผ๋ก ์์ ๊ฐ์ ๊ตฌ์กฐ๋ก ์๋์ด ๋๋๋ฐ ์์ฃผ ์ฌ์ฉ ๋๋ ์ต์ ์ ๋ํด์๋ง ์ค๋ช ์ ํ๋ค.
-f
,--force
์๋ ์ค์ธ container์ฌ๋ SIGKILL๋ฅผ ๋ณด๋ด์ด ๊ฐ์ ๋ก ์ข ๋ฃํ ์ญ์ ๋ฅผ ํ๋ค.
โจ rmi
rmi
๋ช
๋ น์ด๋ images๋ฅผ ์ ๊ฑฐ๋ฅผ ํ ๋ ์ฌ์ฉํ๋ค.
# docker rmi [OPTIONS] IMAGE [IMAGE...]
docker rmi test
๊ธฐ๋ณธ์ ์ผ๋ก ์์ ๊ฐ์ ๊ตฌ์กฐ๋ก ์๋์ด ๋๋๋ฐ ์์ฃผ ์ฌ์ฉ ๋๋ ์ต์ ์ ๋ํด์๋ง ์ค๋ช ์ ํ๋ค.
-f
,--force
๊ฐ์ ๋ก image๋ฅผ ์ ๊ฑฐํ๋ค.
๐ commit
commit
๋ช
๋ น์ด๋ container์ ์ํ๋ฅผ ๊ฐ์ง๊ณ ์๋ก์ด ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค ๋ ์ฌ์ฉํ๋ค.
# docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
docker commit testserver testserver:v2
-a
,--author
author์ ๋ํด ์ ์ ํ๋ค.-c
,--change
์์ฑ๋ image์ Dockerfile ๋ช ๋ น์ด๋ฅผ ์ ์ฉ.-m
,--message
์ปค๋ฐ ๋ฉ์ธ์ง ์์ฑ.-p
,--pause
commit ์์ ์ container ์ผ์ ์ค๋จ. (Default true)
๐ณ Docker๋ฅผ Wordpress ์๋น์ค ์ง์ ๊ตฌํ!
์ด์ ์์์ ์ ๋ฆฌํ ๋ด์ฉ์ ๋ฐํ์ผ๋ก Wordpress ์๋น์ค๋ฅผ ์ง์ ๊ตฌํ์ ํ๋ค.!
์ผ๋จ ์์ ํ๊ธฐ ์ ์ ์๋์ ๊ฐ์ ์กฐ๊ฑด์ผ๋ก ๊ตฌํ์ ํ ์์ ์ด๋ค.
- Docker Container ์์๋ web server๋ฅผ Nginx๋ก ์ฌ์ฉ์ ํ๊ณ , base Images๋ debian buster๋ก ์ค์ ํ๋ค.
- WebServer๋ ๋์์ ์ฌ๋ฌ๊ฐ์ง ์๋น์ค๋ฅผ ์คํ ํ๋ฉฐ, ์๋น์ค์ ๋ชฉ๋ก์ WordPress, phpMyAdmin, MySQL ์ด๋ค.
- WebServer๋ SSL protocol์ด ์ ์ฉ์ด ๋์ด์ผ ํ๋ค.
- Url์ ๋ฐ๋ผ์ ๊ฐ ์๋น์ค๋ก ์ฐ๊ฒฐ์ด ๋์ด์ผ ํ๋ค.
- ๋นํ์ฑํ๊ฐ ๊ฐ๋ฅํ autoindex๋ฅผ ์ด์ฉํ์ฌ ์๋น์ค๊ฐ ๋์ ํ๋์ง์ ๋ํด ํ์ธ์ด ๊ฐ๋ฅํด์ผ ํ๋ค.
๐ SSL ์ค์ ํ๊ธฐ!
์ผ๋จ Makefile
๋ฅผ ๋จผ์ ๊ฐ๋จํ๊ฒ ์์ฑ์ ํด๋ณธ๋ค.
FROM debian:buster
LABEL maintainer="jaeskim <jaeskim.student.42seoul.kr>"
# init setup
RUN apt update -y; apt upgrade -y
# install dependency
RUN apt install nginx curl -y
์ด๋ ๊ฒ ์์ฑํ dockerfile๋ฅผ ๊ฐ์ง๊ณ ์ผ๋จ build๋ฅผ ํ์ฌ์ ๋ด๋ถ์ ์ ๊ทผํ์ฌ์ SSL
์ค์ ์ ์์ํ๋ค.
$ docker build --tag ft_server:v1 .
$ docker run -it --name ft_server ft_server:v1 /bin/bash
SSL
๋ฅผ ์ ์ฉ ํ๊ธฐ ์ํด์๋ ์ธ์ฆ์๊ฐ ํ์ํ๋ฐ ์ธ์ฆ์๋ฅผ CA์ ๋ฑ๋ก์ ํ์ฌ ์ฌ์ฉ์ ํ๊ฒ ๋๋ฉด ๋น์ฉ์ด ๋ฐ์ํ๋ฏ๋ก OpenSSL๋ฅผ ์ด์ฉํ์ฌ ์์ฒด ์๋ช
์ธ์ฆ์๋ฅผ ๋ฐ๊ธ ๋ฐ์์ ๊ตฌํ์ ํ๋ค.
SSL ์ธ์ฆ์๋ฅผ ๋ฐ๊ธ ๋ฐ๊ธฐ ์ํด์๋ ์๋์ ์ ์ฐจ๊ฐ ์งํ๋์ด์ผ ํ๋ค.
-
๊ฐ์ธํค ์์ฑ
openssl genrsa -out ft_server.localhost.key 4096
-
๊ฐ์ธํค๋ฅผ ๊ฐ์ง๊ณ ์์ฒด ์๋ช ์ธ์ฆ์ ์์ฑ
openssl req -x509 -nodes -days 365 -key ft_server.localhost.key -out ft_server.localhost.crt -subj "/C=KR/ST=SEOUL/L=Gaepo-dong/O=42Seoul/OU=jaeskim/CN=localhost"
์ด์ ์์์ ๋ง๋ ft_server.localhost.key
, ft_server.localhost.crt
ํ์ผ์ /etc/ssl/certs
์ /etc/ssl/private
๊ฒฝ๋ก๋ก ์ด๋์ ์์ผ์ค๋ค.
๊ฐ ์ธ์ฆ์ ํ์ผ์ ๋ํ ๊ถํ์ 644
๋ณ๊ฒฝ์ ํ์ฌ์ root ์์ ์ ๋ง์ด ์์ ์ด ๊ฐ๋ฅํ๋๋ก ํ๋ค.
์ด์ /etc/nginx/sites-available/default
ํ์ผ์ ์๋์ ๊ฐ์ด ์์ ์ ํ๋ค.
server {
listen 80 default_server;
listen [::]:80 default_server;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
server_name _;
ssl_certificate /etc/ssl/certs/ft_server.localhost.crt;
ssl_certificate_key /etc/ssl/private/ft_server.localhost.key;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
location / {
try_files $uri $uri/ =404;
}
}
443
์ผ๋ก ๋ค์ด์จ ์์ฒญ์ ์ค์ ํ ssl_certificate
, ssl_certificate_key
ํ์ผ๋ค์ ์ด์ฉํ์ฌ ssl ํต์ ์ ํ๊ฒ ๋๊ณ , ๊ธฐ์กด 80
์ผ๋ก ๋ค์ด์จ ์์ฒญ์ https
์์ฒญ์ redirect ํ๋๋ก ํ์๋ค.
continer ๋ด๋ถ์์ ์์ ํ ํ์ผ์ continer ์ธ๋ถ๋ก ๋ณต์ฌํ๊ธฐ ์ํ์ฌ docker cp
๋ช
๋ น์ด๋ฅผ ์ด์ฉํ์ฌ ์ธ๋ถ๋ก ํ์ผ์ ๊ฐ์ ธ์ค๊ณ ์์์ ํ๋ ์์
๋ค์ dockerfile์ ๋ค์ ์ ์๋ฅผ ํด์ฃผ์๋ค.
FROM debian:buster
LABEL maintainer="jaeskim <jaeskim.student.42seoul.kr>"
# init setup
RUN apt update -y; apt upgrade -y
# install dependency
RUN apt install nginx vim curl -y
# environment
ENV AUTO_INDEX=false
# setup SSL
RUN openssl genrsa -out ft_server.localhost.key 4096; \
openssl req -x509 -nodes -days 365 \
-key ft_server.localhost.key \
-out ft_server.localhost.crt \
-subj "/C=KR/ST=SEOUL/L=Gaepo-dong/O=42Seoul/OU=jaeskim/CN=localhost"; \
chmod 644 ft_server.localhost.*; \
mv ft_server.localhost.crt /etc/ssl/certs/; \
mv ft_server.localhost.key /etc/ssl/private/;
COPY src/nginx-sites-available-default.conf /etc/nginx/sites-available/default
๐ ๋นํ์ฑํ๊ฐ ๊ฐ๋ฅํ autoindex ๊ธฐ๋ฅ ์ถ๊ฐ!
์ด๋ฒ์๋ ๋นํ์ฑํ๊ฐ ๊ฐ๋ฅํ autoindex ๊ธฐ๋ฅ์ ์ถ๊ฐ๋ฅผ ํด๋ณธ๋ค.
cmd
๋ฅผ ์ด์ฉํ์ฌ ๋นํ์ฑํ ํ๋๋ก ๋ง๋ค์ด ๋ณธ๋ค.
์ผ๋จ server.sh
ํ์ผ์ ์์ฑ์ ํ๊ณ ENTRYPOINT
๋ก ์ค์ ์ ํ๋ค.
#!/bin/bash
/bin/bash -C /setup_autoindex.sh $1
service nginx start
if [ $? -eq 0 ]; then
tail -f /var/log/nginx/access.log /var/log/nginx/error.log
f
๊ทธ๋ฆฌ๊ณ setup_autoindex.sh
์๊ฒ ์ฒซ๋ฒ์งธ ์ธ์๋ฅผ ๊ฐ์ด ์ ๋ฌํ์ฌ cmd
๋ฅผ ์ด์ฉํ์ฌ ์ ์ด๊ฐ ๊ฐ๋ฅํ๋๋ก ํ๋ค.
#!/bin/bash
# setup index.html
if [ -e "/var/www/html/index.nginx-debian.html" ]; then
mv /var/www/html/index.nginx-debian.html /var/www/html/index.html
fi
if [ "$1" == "autoindex" ]; then
echo "autoindex on!"
sed -i "s@autoindex off;@autoindex on;@g" /etc/nginx/sites-available/default
sed -i "s@index index.html index.htm;@index index.htm;@g" /etc/nginx/sites-available/default
else
echo "autoindex off!"
sed -i "s@autoindex on;@autoindex off;@g" /etc/nginx/sites-available/default
sed -i "s@index index.htm;@index index.html index.htm;@g" /etc/nginx/sites-available/default
fi
์ด์ ๋น๋๋ฅผ ํ๊ณ run
๋ฅผ ๋์ ํ ๋ autoindex
cmd๋ฅผ ๊ฐ์ด ๋ณด๋์ ๋์ ๋ํด์ ์ ๋๋ก ๋์ ํ๋์ง๋ฅผ ํ์ธ ํด๋ณธ๋ค.
$ docker run --rm -it --env AUTO_INDEX=true -p 443:443 -p 80:80 --name ft_server ft_server:v3 autoindex
๐ฆ mysqlDB(maria DB) ์ค์น ๋ฐ ์ค์ ํ๊ธฐ!
์ด๋ฒ์๋ wordpress๋ฅผ ์ํ DB๋ฅผ ์ค์ ํด ๋ณธ๋ค.
apt install marinade-server
๋ช
๋ น์ด๋ฅผ ์ด์ฉํ์ฌ ์ค์น๋ฅผ ํ๋ค.
์ฌ๊ธฐ์ mariadb๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ๊ธฐ์กด mysql์ด Oracle๋ก ์ธ์๊ฐ ๋๋ฉด์ Fork๋์ด ์งํ๋๊ณ ์๋ opensource ํ๋ก์ ํธ ์ด๋ค. (mysql๊ณผ ๋์ผํ ์์ค์ฝ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ฌ ๋๋ถ๋ถ์ ์์ ์ด ํธํ์ด ๋๋ค.)
Maria db๋ฅผ php์ ํจ๊ป ์ฌ์ฉ์ ํ๊ธฐ ์ํด์๋ ์ฌ๋ฌ๊ฐ์ง ๋ชจ๋์ด ํ์ํ๋ฐ ์ด์ ๋ฐ๋ฅธ ๋ชจ๋์ ์ค์นํ๋ค.
$ apt install php-mysql php-mbstring
- php-mysql : php์์ mysql๋ช ๋ น์ด๋ฅผ ์คํํ๊ธฐ ์ํ ๋ชจ๋
- php-mbstring : ํ๊ตญ์ด, ์ค๊ตญ์ด, ์ผ๋ณธ์ด์ ๊ฐ์ multibyte ๋ฌธ์์ด์ ์ฒ๋ฆฌ ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๋ชจ๋
์ด์ mysql service
๋ฅผ ์์์ํค๊ณ SQL ๋ช
๋ น์ด์ ๋ํด์ ์์ฑ์ ํด๋ณธ๋ค.
# wordpress db ์์ฑ
CREATE DATABASE wordpress;
# wordpress db๋ฅผ ์ฌ์ฉ
USE wordpress;
# jaeskim user๋ฅผ password `testpassword`์ผ๋ก ๋ง๋ค๊ณ localhost์์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํ๋๋ก ํจ.
CREATE USER 'jaeskim'@'localhost' IDENTIFIED BY 'testpassword';
# jaeskim์๊ฒ wordpress db์ ๋ํ ๊ถํ์ ์ ๋ถ ์์
GRANT ALL PRIVILEGES ON wordpress.* TO 'jaeskim'@'localhost' WITH GRANT OPTION;
# ๊ถํ ์ค์ ์
๋ฐ์ดํธ
FLUSH PRIVILEGES;
์ด์ ์ด๋ ๊ฒ ์์ฑํ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์ค์ dockerfile์ ์ ์ฉ์ ํด๋ณธ๋ค.
์ด๋ dbname, dbuser, db_password์ ๋ํ ํญ๋ชฉ์ ARG
๋ช
๋ น์ด๋ฅผ ์ด์ฉํ์ฌ ๊ด๋ฆฌ๋ฅผ ํ๋ค. (์ค์ ๋ก ์ํธ์ ๊ฐ์ ์ค์ ์ ๋ณด๋ docker secret
๋ช
๋ น์ด๋ฅผ ์ด์ฉํ์ฌ ๊ด๋ฆฌํ๋ ๊ฒ์ด ๊ถ์ฅ๋จ.)
# init arg
ARG WP_DB_NAME=wordpress
ARG WP_DB_USER=jaeskim
ARG WP_DB_PASSWORD=42seoul
# setup mysqlDB(mariaDB)
RUN service mysql start; \
mysql -e "CREATE DATABASE ${WP_DB_NAME};\
USE ${WP_DB_NAME}; \
CREATE USER '${WP_DB_USER}'@'localhost' IDENTIFIED BY '${WP_DB_PASSWORD}'; \
GRANT ALL PRIVILEGES ON ${WP_DB_NAME}.* TO '${WP_DB_USER}'@'localhost' WITH GRANT OPTION; \
FLUSH PRIVILEGES;"
์์ ๊ฐ์ด mysql -e
์ ARG
๋ฅผ ์ด์ฉํ์ฌ mysql ์๋น์ค ๋ถ๋ถ์ ์์ฑํ์๋ค.
๐ wordpress ์๋น์ค ์ค์น ๋ฐ ์ค์ ํ๊ธฐ!
์ด์ ์ ์ค์นํ curl
๋ฅผ ์ด์ฉํ์ฌ https://wordpress.org/latest.tar.gz ๋ฅผ ๋ค์ด ๋ฐ์์ ์ค์น๋ฅผ ํด๋ณธ๋ค!!!
์ผ๋จ wordpress๋ฅผ ์ค์น ํ๊ธฐ ์ ์ nignix์์ php๋ฅผ ๋์ ํ ์ ์๋๋ก ๋์ ์ฃผ๋ ๋ชจ๋์ธ php-fpm
๋ฅผ ์ค์น ํ์ฌ ์ฌ์ฉ์ ํ๋ค.
๊ทธ๋ฆฌ๊ณ niginx/sites-available/default
ํ์ผ์ ์์ ํ์ฌ์ php๊ฐ ๋์ ํ๋๋ก ์์ ์ ํ๋ค.
index index.html index.htm index.php;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
}
์ด์ ๊ธฐ๋ณธ์ ์ธ ์ค๋น๊ฐ ๋๋ฌ์ผ๋ ์๋์ ๋ช ๋ น์ด๋ฅผ ํตํด์ wordpress๋ฅผ ๋ค์ด ๋ฐ๊ณ ์์ถ์ ํด์ ํ๋ค.
$ curl -O https://wordpress.org/latest.tar.gz
# ๋ค์ด ํ srcs๋ก ์ด๋์ ์์ผ์ค๋ค.
$ tar -xzf latest.tar.gz -C /var/www/html/
์ด์ ๋ด๋ถ์ ์กด์ฌํ๋ wp-config-sample.php
sed ๋ช
๋ น์ด๋ฅผ ํตํด์ ์์ ์ ํด๋ณธ๋ค.
๋ด๋ถ๋ฅผ ๋ณด๊ฒ ๋๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ ํด์ผ ํ๋ DB ์ ๋ณด๊ฐ ์๋๋ฐ ์ด ๋ถ๋ถ์ ์๊น์ ์ mysql๋ฅผ ์ค์ ํ๋ฉด์ ์ฌ์ฉ ํ์๋ ๋ณ์๋ฅผ ์ด์ฉํ์ฌ ์์ ์ ํ๋๋ก ํ๋ค.!
RUN mv /var/www/html/wordpress/wp-config-sample.php /var/www/html/wordpress/wp-config.php; \
sed -i "s/database_name_here/${WP_DB_NAME}/g" /var/www/html/wordpress/wp-config.php; \
sed -i "s/username_here/${WP_DB_USER}/g" /var/www/html/wordpress/wp-config.php; \
sed -i "s/password_here/${WP_DB_PASSWORD}/g" /var/www/html/wordpress/wp-config.php
๊ทธ๋ฆฌ๊ณ ์๋์ ๊ฐ์ด ์ฌ๋ฌ๊ฐ์ง key, salt ๊ฐ์ ์ ์ ํ๋ ๋ถ๋ถ์ด ์๋๋ฐ ์ด๊ฒ์ /dev/null
๋ฅผ ์ด์ฉํ์ฌ์ ์ฑ์์ค๋ค.
wp_salt=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9!@#\%+=' | fold -w 64 | sed 1q); \
sed -i "s/define( 'AUTH_KEY', 'put your unique phrase here' );/define( 'AUTH_KEY', '$wp_salt' );/g" /var/www/html/wordpress/wp-config.php; \
wp_salt=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9!@#\%+=' | fold -w 64 | sed 1q); \
sed -i "s/define( 'SECURE_AUTH_KEY', 'put your unique phrase here' );/define( 'SECURE_AUTH_KEY', '$wp_salt' );/g" /var/www/html/wordpress/wp-config.php; \
wp_salt=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9!@#\%+=' | fold -w 64 | sed 1q); \
sed -i "s/define( 'LOGGED_IN_KEY', 'put your unique phrase here' );/define( 'LOGGED_IN_KEY', '$wp_salt' );/g" /var/www/html/wordpress/wp-config.php; \
wp_salt=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9!@#\%+=' | fold -w 64 | sed 1q); \
sed -i "s/define( 'NONCE_KEY', 'put your unique phrase here' );/define( 'NONCE_KEY', '$wp_salt' );/g" /var/www/html/wordpress/wp-config.php; \
wp_salt=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9!@#\%+=' | fold -w 64 | sed 1q); \
sed -i "s/define( 'AUTH_SALT', 'put your unique phrase here' );/define( 'AUTH_SALT', '$wp_salt' );/g" /var/www/html/wordpress/wp-config.php; \
wp_salt=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9!@#\%+=' | fold -w 64 | sed 1q); \
sed -i "s/define( 'SECURE_AUTH_SALT', 'put your unique phrase here' );/define( 'SECURE_AUTH_SALT', '$wp_salt' );/g" /var/www/html/wordpress/wp-config.php; \
wp_salt=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9!@#\%+=' | fold -w 64 | sed 1q); \
sed -i "s/define( 'LOGGED_IN_SALT', 'put your unique phrase here' );/define( 'LOGGED_IN_SALT', '$wp_salt' );/g" /var/www/html/wordpress/wp-config.php; \
wp_salt=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9!@#\%+=' | fold -w 64 | sed 1q); \
sed -i "s/define( 'NONCE_SALT', 'put your unique phrase here' );/define( 'NONCE_SALT', '$wp_salt' );/g" /var/www/html/wordpress/wp-config.php; \
unset wp_salt
์ด์ ์ ๋ฒ์ ์์ฑํ src/server.sh
ํ์ผ์ ์์ ํ์ฌ์ mysql
, php-fpm
๋ฑ๋ ๊ฐ์ด ์คํ์ด ๊ฐ๋ฅํ๋๋ก ์ค์ ์ ํ๋ค.
#!/bin/bash
/bin/bash -C /setup_autoindex.sh $1
service mysql start
service php7.3-fpm start
service nginx start
if [ $? -eq 0 ]; then
tail -f /var/log/nginx/access.log /var/log/nginx/error.log
fi
์ด์ dockerfile๋ก ์ ๋ฆฌํ์ฌ์ ์๋น์ค๋ฅผ ์คํํด ๋ณธ๋ค.!
$ docker run --rm -it -p 443:443 -p 80:80 --name ft_server ft_server
https://localhost/wordpress
๋ก ์ ๊ทผ์ ํด๋ณด๋ฉด ์๋์ ๊ฐ์ด wordpress๊ฐ ์ ์์ ์ผ๋ก ์ฌ๋ผ์จ ๊ฒ์ ๋ณผ ์ ์๋ค.
๐งโ๐ป phpmyadmin ์ค์น ํ๊ธฐ!
์ด์ ๋ง์ง๋ง์ผ๋ก db๊ด๋ฆฌ๋ฅผ ์ํ phpmyadmin
๋ฅผ ์ค์น ํด๋ณธ๋ค.
Curl ๋ช ๋ น์ด๋ฅผ ์ด์ฉํ์ฌ ์ผ๋จ phpmyadmin๋ฅผ ๋ค์ด ๋ฐ๋๋ค.
RUN curl -O https://files.phpmyadmin.net/phpMyAdmin/5.0.4/phpMyAdmin-5.0.4-all-languages.tar.gz
๊ทธ๋ฆฌ๊ณ ์ด์ ์์ถ์ ํด์ ํ๊ณ ์์ฑ๋ ํด๋์ ์ด๋ฆ์ ์์ ํด์ค ํ config.sample.inc.php
๋ฅผ ์ด์ฉํ์ฌ ๊ฐ๋จํ๊ฒ ์ค์ ์ ํด๋ณธ๋ค.
์ฌ๊ธฐ์๋ blowfish_secret
๋ผ๋ cookie๋ฅผ ์ํธํ ํ๊ฒ ๋๋ ํค๋ฅผ ๋ง๋ค์ด์ ๋ฃ์ด์ฃผ๊ฒ ๋๋ค.
blowfish_secret=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9!@#\%+=' | fold -w 64 | sed 1q); \
sed -i "s@''; /\* YOU MUST FILL IN THIS FOR COOKIE AUTH! \*/@'$blowfish_secret';@g" /var/www/html/phpmyadmin/config.inc.php; \
unset blowfish_secret;
๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก ํ์ฌ /var/www/html
์ด root
์์ ์๋ก ๋ฑ๋ก์ด ๋์ด ์์ด์ phpmyadmin
์์ temp directory๋ฅผ ์์ฑ์ ๋ชปํ๋ ์ด์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๊ถํ์ www-data:www-data
๋ก ์์ ์ ํด์ค๋ค.
์ด์ ์ ๊ทผ์ ํ๊ฒ ๋๋ฉด ์์์ ๋ง๋ค์๋ ๊ณ์ ์ ํตํด์ ๋ก๊ทธ์ธ์ด ๊ฐ๋ฅ ํ ๋ชจ์ต์ ๋ณผ ์ ์๋ค.
42Seoul
์์ ์งํํ ft_server ํ๋ก์ ํธ๋ฅผ ์ ๋ฆฌํ ๊ธ ์ ๋๋ค. ์ฌ๊ธฐ์ ์งํ๋ Dockerfile๊ณผ src ํ์ผ์ ์๋์ github์์ ํ์ธ ํ ์ ์์ต๋๋ค.!