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