Docker Compose
๋ฉํฐ ์ปจํ
์ด๋ ํ๊ฒฝ
๋ฐ๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์์ค์ฝ๋ ๋ค์ด๋ก๋
git clone https://github.com/youngwjung/to-do.git && cd to-do
์ ํ๋ฆฌ์ผ์ด์ ์์ค ์ฝ๋ ๋ฐ README ๋ฆฌ๋ทฐ
Dockerfile ์์ฑ
cat <<EOF | tee frontend/Dockerfile FROM nginx:alpine COPY . /usr/share/nginx/html EOF
ํ๋ก ํธ์๋ ์ปจํ ์ด๋ ์ด๋ฏธ์ง ์์ฑ
docker image build -t frontend frontend/
ํ๋ก ํธ์๋ ์ปจํ ์ด๋ ์์ฑ
docker container run --name frontend -d -p 8080:80 frontend
์น๋ธ๋ผ์ฐ์ ์์ ์ปจํ ์ด๋๋ก ์ ๊ทผ๋๋์ง ํ์ธ - ์๋ ๋ช ๋ น์ด๋ก ์ฃผ์ ํ์ธ ๊ฐ๋ฅ
echo "$(curl -s ifconfig.io):8080"
Dockerfile ๋ณ๊ฒฝ
cat <<'EOF' | tee frontend/Dockerfile FROM nginx:alpine COPY . /usr/share/nginx/html ARG API_ENDPOINT RUN sed -i 's/localhost:9000/'"$API_ENDPOINT"'/g' /usr/share/nginx/html/js/main.js EOF
ํ๋ก ํธ์๋ ์ปจํ ์ด๋ ์ด๋ฏธ์ง ์ฌ์์ฑ
docker image build --no-cache -t frontend \ --build-arg API_ENDPOINT=$(curl -s ifconfig.io):9000 \ frontend/
ํ๋ก ํธ์๋ ์ปจํ ์ด๋ ์ฌ์์ฑ
{ docker container rm frontend --force docker container run --name frontend -d -p 8080:80 frontend }
์น ๋ธ๋ผ์ฐ์ ์์ ๋ก๋ฉ๋ ํ์ด์ง ๋ฆฌํ๋ ์
Dockerfile ์์ฑ
cat <<EOF | tee api/Dockerfile FROM golang:1.20-alpine as builder WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY *.go ./ RUN go build -o /api FROM alpine RUN mkdir /app WORKDIR /app COPY --from=builder /api /app/api EXPOSE 9000 CMD ["/app/api"] EOF
API ์ปจํ ์ด๋ ์ด๋ฏธ์ง ์์ฑ
docker image build -t api api/
API ์ปจํ ์ด๋ ์์ฑ
docker container run --name api -d -p 9000:9000 api
API ์ปจํ ์ด๋ ์ํ ํ์ธ
docker container ls -a
API ์ปจํ ์ด๋ ๋ก๊ทธ ํ์ธ
docker logs api
MySQL ์ปจํ ์ด๋ ์์ฑ
docker container run --name mysql -d -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=asdf1234 mysql:5.7
๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง ์์ฑ
mysql -h 127.0.0.1 -u root -pasdf1234 < database/schema.sql
API ์ปจํ ์ด๋ ์ฌ์์ฑ
{ docker container rm api --force docker container run --name api -d -p 9000:9000 \ -e DATABASE_HOST=$(docker container inspect mysql --format '{{.NetworkSettings.IPAddress}}') \ -e DATABASE_PASSWORD=asdf1234 \ api }
API ์ปจํ ์ด๋ ๋ก๊ทธ ํ์ธ
docker logs api
Redis ์ปจํ ์ด๋ ์์ฑ
docker container run --name redis -d redis
API ์ปจํ ์ด๋ ์ฌ์์ฑ
{ docker container rm api --force docker container run --name api -d -p 9000:9000 \ -e DATABASE_HOST=$(docker container inspect mysql --format '{{.NetworkSettings.IPAddress}}') \ -e DATABASE_PASSWORD=asdf1234 \ -e REDIS_HOST=$(docker container inspect redis --format '{{.NetworkSettings.IPAddress}}') \ api }
์คํ์ค์ธ ์ปจํ ์ด๋ ๋ชฉ๋ก ํ์ธ
docker container ls
๋ณด์๊ทธ๋ฃน์ ์ธ๋ฐ์ด๋ ๊ท์น ์ถ๊ฐ
aws ec2 authorize-security-group-ingress \ --group-id $(aws ec2 describe-security-groups \ --filters Name=group-name,Values=$(curl -s http://169.254.169.254/latest/meta-data/security-groups) \ --query "SecurityGroups[0].GroupId" --output text) \ --protocol tcp \ --port 9000 \ --cidr 0.0.0.0/0 \ --output text
์น ๋ธ๋ผ์ฐ์ ์์ ๋ก๋ฉ๋ ํ์ด์ง ๋ฆฌํ๋ ์
๋ฆฌ์์ค ์ ๋ฆฌ
{ docker container rm $(docker container ls -aq) --force docker image prune --all --force docker volume prune --force cd ~/environment }
Docker Compose
Docker Compose ์ค์น
{ sudo mkdir -p /usr/local/lib/docker/cli-plugins sudo curl -SL https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins/docker-compose sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose }
Docker Compose ์ค์น ํ์ธ
docker compose version
์๋ํ๋ ์ค๋ฅผ ๊ตฌ์ฑํ Compose ํ์ผ ์์ฑ
mkdir wordpress && cd wordpress && \ cat <<EOF | tee docker-compose.yml services: wordpress: image: wordpress EOF
Compose ํ์ผ์ ๋ช ์๋ ๊ตฌ์ฑ๋๋ก ์ปจํ ์ด๋ ํ๊ฒฝ ์์ฑ
docker compose up -d
์คํ์ค์ธ Compose ํ๋ก์ ํธ ๋ชฉ๋ก ํ์ธ
docker compose ls
Compose ํ์ผ ์์
cat <<EOF | tee docker-compose.yml name: blog services: wordpress: image: wordpress EOF
์์ ์ฌํญ ๋ฐ์
docker compose up -d
์คํ์ค์ธ Compose ํ๋ก์ ํธ ๋ชฉ๋ก ํ์ธ
docker compose ls
์์ ํ๊ธฐ์ ๋ฒ์ ์ Compose ํ์ผ๋ก ์์ฑ๋ ๋ฆฌ์์ค๋ฅผ ์๋์ผ๋ก ์ญ์
{ docker container rm wordpress-wordpress-1 --force docker network rm wordpress_default }
Compose๋ฅผ ํตํด์ ์คํ์ค์ธ ์ปจํ ์ด๋ ๋ชฉ๋ก ํ์ธ
docker compose ps
Compose ํ์ผ ์์
cat <<EOF | tee docker-compose.yml name: blog services: wordpress: image: wordpress container_name: wordpress EOF
์์ ์ฌํญ ๋ฐ์
docker compose up -d
Compose๋ฅผ ํตํด์ ์คํ์ค์ธ ์ปจํ ์ด๋ ๋ชฉ๋ก ํ์ธ
docker compose ps
์คํ์ค์ธ ๋ชจ๋ ์ปจํ ์ด๋ ๋ชฉ๋ก ํ์ธ
docker container ls
NGINX ์ปจํ ์ด๋ ์์ฑ
docker run --name nginx -d nginx
์คํ์ค์ธ ๋ชจ๋ ์ปจํ ์ด๋ ๋ชฉ๋ก ํ์ธ
docker container ls
Compose๋ฅผ ํตํด์ ์คํ์ค์ธ ์ปจํ ์ด๋ ๋ชฉ๋ก ํ์ธ
docker compose ps
์๋ก์ด ํฐ๋ฏธ๋์ ์ด๊ณ Compose๋ฅผ ํตํด์ ์คํ์ค์ธ ์ปจํ ์ด๋ ๋ชฉ๋ก ํ์ธ
docker compose ps
์คํ์ค์ธ Compose ํ๋ก์ ํธ ๋ชฉ๋ก ํ์ธ
docker compose ls
์์ฑ๋ ๋ชจ๋ ์ปจํ ์ด๋์ ๋ถ์ฌ๋ Label ํ์ธ
docker container inspect \ $(docker container ps -aq) --format '{{.Name}} - {{json .Config.Labels}}'
๊ธฐ์กด ํฐ๋ฏธ๋๋ก ์ด๋ํด์ NGINX ์ญ์
docker container rm nginx --force
Compose ํ์ผ ์์
cat <<EOF | tee docker-compose.yml name: blog services: wordpress: image: wordpress container_name: wordpress ports: - 8080:80 EOF
์์ ์ฌํญ ๋ฐ์
docker compose up -d
์น๋ธ๋ผ์ฐ์ ์์ ํฌํธํฌ์๋ฉํ ํฌํธ๋ฅผ ํตํด์ ์ปจํ ์ด๋๋ก ์ ๊ทผ๋๋์ง ํ์ธ - ์๋ ๋ช ๋ น์ด๋ก ์ฃผ์ ํ์ธ ๊ฐ๋ฅ
echo "$(curl -s ifconfig.io):8080"
Compose ํ์ผ ์์
cat <<EOF | tee docker-compose.yml name: blog services: wordpress: image: wordpress container_name: wordpress ports: - 8080:80 environment: - WORDPRESS_DB_HOST=mysql - WORDPRESS_DB_USER=wordpress - WORDPRESS_DB_PASSWORD=wordpress - WORDPRESS_DB_NAME=wordpress depends_on: - mysql mysql: image: mysql volumes: - mysql-data:/var/lib/mysql environment: - MYSQL_ROOT_PASSWORD=asdf1234 - MYSQL_USER=wordpress - MYSQL_PASSWORD=wordpress - MYSQL_DATABASE=wordpress volumes: mysql-data: EOF
์์ ์ฌํญ ๋ฐ์
docker compose up -d
์น๋ธ๋ผ์ฐ์ ์์ ์๋ํ๋ ์ค ์ฌ์ดํธ ์ฌ์ ์ - ์๋ ๋ช ๋ น์ด๋ก ์ฃผ์ ํ์ธ ๊ฐ๋ฅ
echo "$(curl -s ifconfig.io):8080"
Compose ํ์ผ ์์
cat <<EOF | tee docker-compose.yml name: blog services: wordpress: image: wordpress container_name: wordpress volumes: - plugins:/var/www/html/wp-content/plugins ports: - 8080:80 environment: - WORDPRESS_DB_HOST=mysql - WORDPRESS_DB_USER=wordpress - WORDPRESS_DB_PASSWORD=wordpress - WORDPRESS_DB_NAME=wordpress depends_on: - mysql - wordpress-init mysql: image: mysql volumes: - mysql-data:/var/lib/mysql environment: - MYSQL_ROOT_PASSWORD=asdf1234 - MYSQL_USER=wordpress - MYSQL_PASSWORD=wordpress - MYSQL_DATABASE=wordpress wordpress-init: image: alpine volumes: - plugins:/plugins command: - "sh" - "-c" - "wget -O https://downloads.wordpress.org/plugin/classic-editor.1.6.3.zip && unzip -o classic-editor.1.6.3.zip -d /plugins" volumes: mysql-data: plugins: EOF
์์ ์ฌํญ ๋ฐ์
docker compose up -d
ํ๋ฌ๊ทธ์ธ์ด ์ถ๊ฐ ๋์๋์ง ํ์ธ
wp-cli๋ฅผ ํตํด์ ์๋ํ๋ ์ค ํ ๋ง ์ค์น ์๋
docker compose exec wordpress wp theme install blocksy --activate --allow-root
Dockerfile ์์ฑ
cat <<EOF | tee Dockerfile FROM wordpress RUN curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar && \ chmod +x wp-cli.phar && mv wp-cli.phar /usr/local/bin/wp EOF
Compose ํ์ผ ์์
cat <<EOF | tee docker-compose.yml name: blog services: wordpress: build: . container_name: wordpress volumes: - plugins:/var/www/html/wp-content/plugins ports: - 8080:80 environment: - WORDPRESS_DB_HOST=mysql - WORDPRESS_DB_USER=wordpress - WORDPRESS_DB_PASSWORD=wordpress - WORDPRESS_DB_NAME=wordpress depends_on: - mysql - wordpress-init mysql: image: mysql volumes: - mysql-data:/var/lib/mysql environment: - MYSQL_ROOT_PASSWORD=asdf1234 - MYSQL_USER=wordpress - MYSQL_PASSWORD=wordpress - MYSQL_DATABASE=wordpress wordpress-init: image: alpine volumes: - plugins:/plugins command: - "sh" - "-c" - "wget -O https://downloads.wordpress.org/plugin/classic-editor.1.6.3.zip && unzip -o classic-editor.1.6.3.zip -d /plugins" volumes: mysql-data: plugins: EOF
์์ ์ฌํญ ๋ฐ์
docker compose up -d
์น ๋ธ๋ผ์ฐ์ ์์ ์๋ํ๋ ์ค ๋ฉ์ธ ํ์ด์ง๋ก ์ด๋ํด์ ํ ๋ง ํ์ธ
wp-cli๋ฅผ ํตํด์ ์๋ํ๋ ์ค ํ ๋ง ์ค์น
docker compose exec wordpress wp theme install blocksy --activate --allow-root
์น ๋ธ๋ผ์ฐ์ ์์ ์๋ํ๋ ์ค ๋ฉ์ธ ํ์ด์ง๋ก ์ด๋ํด์ ํ ๋ง ํ์ธ
wordpress ์ปจํ ์ด๋์์ ์คํ์ค์ธ ํ๋ก์ธ์ค ํ์ธ
docker compose top
wordpress ์ปจํ ์ด๋์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค๊ณ ๊ฐ์ ํ๊ณ ์คํ์ค์ธ ํ๋ก์ธ์ค ์ข ๋ฃ
docker compose exec wordpress pkill apache2
์๋ํ๋ ์ค ์ฌ์ดํธ์ ์ ์ ๋๋์ง ํ์ธ
Compose ํ๋ก์ ํธ ์ํ ํ์ธ
docker compose ls
wordpress ์ปจํ ์ด๋๊ฐ ์คํ์ค์ธ์ง ํ์ธ
docker compose ps -a
Compose ํ์ผ ์์
cat <<EOF | tee docker-compose.yml name: blog services: wordpress: build: . container_name: wordpress restart: always volumes: - plugins:/var/www/html/wp-content/plugins ports: - 8080:80 environment: - WORDPRESS_DB_HOST=mysql - WORDPRESS_DB_USER=wordpress - WORDPRESS_DB_PASSWORD=wordpress - WORDPRESS_DB_NAME=wordpress depends_on: - wordpress-init mysql: image: mysql volumes: - mysql-data:/var/lib/mysql environment: - MYSQL_ROOT_PASSWORD=asdf1234 - MYSQL_USER=wordpress - MYSQL_PASSWORD=wordpress - MYSQL_DATABASE=wordpress wordpress-init: image: alpine volumes: - plugins:/plugins command: - "sh" - "-c" - "wget -O https://downloads.wordpress.org/plugin/classic-editor.1.6.3.zip && unzip -o classic-editor.1.6.3.zip -d /plugins" volumes: mysql-data: plugins: EOF
Compose ํ๋ก์ ํธ ์ฌ์คํ
docker compose up -d
์๋ํ๋ ์ค ์ฌ์ดํธ์ ์ ์ ๋๋์ง ํ์ธ
wordpress ์ปจํ ์ด๋์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค๊ณ ๊ฐ์ ํ๊ณ ์คํ์ค์ธ ํ๋ก์ธ์ค ์ข ๋ฃ
docker compose exec wordpress pkill apache2
์๋ํ๋ ์ค ์ฌ์ดํธ์ ์ ์ ๋๋์ง ํ์ธ
wordpress ์ปจํ ์ด๋๊ฐ ์คํ์ค์ธ์ง ํ์ธ
docker compose ps
wordpress ์ปจํ ์ด๋๊ฐ ์ญ์ ๋๋ฉด ๋ค์ ์์ฑ ๋ ๊น์?
docker container rm wordpress --force
wordpress ์ปจํ ์ด๋๊ฐ ์คํ์ค์ธ์ง ํ์ธ
docker compose ps -a
Compose ํ๋ก์ ํธ ์ญ์
docker compose down
Compose์ ๋ช ์ํ๋ Volume๋ค์ด ๋จ์ ์๋์ง ํ์ธ
docker volume ls
Compose ํ๋ก์ ํธ ์์ฑ
docker compose up -d
์น๋ธ๋ผ์ฐ์ ์์ ์๋ํ๋ ์ค ์ฌ์ดํธ ์ฌ์ ์ - ์๋ ๋ช ๋ น์ด๋ก ์ฃผ์ ํ์ธ ๊ฐ๋ฅ
echo "$(curl -s ifconfig.io):8080"
Compose ํ๋ก์ ํธ ์ญ์
docker compose down --volumes
๋ฉํฐ ์ปจํ ์ด๋ ํ๊ฒฝ์์ ๊ฐ๋ณ๋ก ์์ฑํ๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ค์ Docker Compose๋ฅผ ํตํด์ ๊ตฌ์ฑ
๋ฆฌ์์ค ์ ๋ฆฌ
{ docker compose down --volumes docker container rm $(docker container ls -aq) --force docker image prune --all --force docker volume prune --force docker system prune --all --force cd ~/environment }
Last updated