본문 바로가기

SK네트웍스 Family AI캠프 10기/Daily 회고

68일차. Docker

더보기

 

68일 차 회고.

 

 오늘도 도커에 대해서 배우고 실습했는데 조금 졸리긴 했지만 재미있었다. 쉬는 시간 중간중간에 인적성 문제도 풀고 있는데 시간이 너무 촉박한 것 같아서 걱정이 된다.

 

 

 

 

1. Docker

 

 

1-0. Login & Logout

 

docker login					# Docker login

docker logout					# Docker logout

 

 

1-1. Nginx

 

Image

  • 만약 오류가 날 경우, Docker를 실행한다.
docker search nginx				# 'nginx' image 검색
docker pull nginx				# 'nginx' image 다운로드

docker images					# image 목록 확인
"""
REPOSITORY      TAG       IMAGE ID       CREATED        SIZE
nginx           latest    4e1b6bae1e48   10 hours ago   192MB
"""

 

Container

docker run --name nginx-container -d -p 80:80 nginx:latest	# container 생성 및 실행

docker ps							# 실행 중인 container 목록 확인
"""
CONTAINER ID   IMAGE            COMMAND                   CREATED          STATUS          PORTS                   NAMES
d711fae47f0b   nginx:latest     "/docker-entrypoint.…"    29 seconds ago   Up 28 seconds   0.0.0.0:80->80/tcp      nginx-container
"""

 

Container 삭제

docker stop d711fae47f0b			# container id가 'd711fae47f0b'인 container 중지

docker ps -a					# container 전체 목록 확인
"""
CONTAINER ID   IMAGE            COMMAND                   CREATED         STATUS                          PORTS        NAMES
d711fae47f0b   nginx:latest     "/docker-entrypoint.…"    5 minutes ago   Exited (0) About a minute ago  
"""

docker rm d711fae47f0b				# container id가 'd711fae47f0b'인 container 삭제

docker ps -a					# container 전체 목록 확인
"""
CONTAINER ID    IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES
"""

 

Image 삭제

docker rmi 4e1b6bae1e48				# image id가 '4e1b6bae1e48'인 image 삭제

docker images					# image 목록 확인
"""
REPOSITORY    TAG    IMAGE ID    CREATED    SIZE
"""

 

 

1-2. Docker Hub 업로드

 

Dockerfile

FROM node:12

LABEL version="1.0"
LABEL description="This is a simple Node.js application"

COPY hello.js /

CMD ["node", "hello.js"]

 

Image

docker build -t hello-js:latest .

docker images

 

Container

docker run -d -p 8080:8080 --name hello-js-web hello-js

docker ps

 

Container 삭제

docker stop hello-js-web

docker ps

docker rm hello-js-web

docker ps -a

 

Docker Hub Image 업로드

docker images
"""
REPOSITORY      TAG       IMAGE ID       CREATED         SIZE
hello-js        latest    b009c8249229   7 minutes ago   918MB
"""

docker tag hello-js:latest ine94/hello-js:latest

docker images
"""
REPOSITORY        TAG       IMAGE ID       CREATED         SIZE
ine94/hello-js    latest    b009c8249229   9 minutes ago   918MB
hello-js          latest    b009c8249229   9 minutes ago   918MB
"""

docker push ine94/hello-js:latest

 

Image 삭제

docker rmi hello-js:latest
docker rmi ine94/hello-js:latest

docker images

 

Docker Hub Image 다운로드

docker search ine94
docker pull ine94/hello-js

docker images

 

Container

docker run -d -p 8080:8080 --name hello-js-web ine94/hello-js

 

 

1-3. Mount

 

 

MySQL

  • Image
docker pull mysql

docker images
  • Container
docker run `
--name mysql-container `
-d -p 3306:3306 `
-e MYSQL_ROOT_PASSWORD= `
-v C:\dev\docker\database:/var/lib/mysql `
mysql:latest

docker ps
  • MySQL Server
docker exec -it mysql-container /bin/bash

mysql -u root -p

SHOW DATABASES;

exit

exit

 

Nginx

  • Image & Container
docker run `
--name web `
-d -p 80:80 `
-v C:\dev\docker\web:/usr/share/nginx/html `
nginx:1.14

docker ps

 

권한 제어

  • Container에서 수정이 불가능하다.
docker run `
--name web `
-d -p 80:80 `
-v C:\dev\docker\web:/usr/share/nginx/html:ro `
nginx:1.14

docker ps
docker exec -it web /bin/bash

cd /usr/share/nginx/html
echo "<h1>Hello World</h1>" > index.html
# bash: index.html: Read-only file system

 

 

1-4. Network

 

Network

  • bridge
    • 기본 네트워크 드라이버
    • 같은 호스트 내 여러 컨테이너들이 서로 통신할 수 있다.
  • host
    • 컨테이너가 호스트와 동일한 네트워크 공간을 사용한다.
    • Port Mapping이 필요하지 않다.
  • overlay
    • 여러 호스트에 분산된 컨테이너 간 통신을 가능하게 한다.
    • Kubernetes와 같은 오케스트레이션 환경에서 주로 사용한다.
    • 독립적인 가상 네트워크를 구성하여 서비스 간 안전한 통신을 보장한다.

 

Network 명령어

  • 네트워크 조회
docker network ls
  • 네트워크 생성
docker network create my-net

docker network ls
  • 네트워크 상세 정보
docker network inspect my-net
"""
[
    {
        "Name": "my-net",
        "Id": "a0dea5d9b7a4a1f23c8d775bc7f5d0d50e2ae68753ef2abe3ed548a55e5f1c15",
        "Created": "2025-04-17T05:21:13.317311709Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv4": true,
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.21.0.0/16",
                    "Gateway": "172.21.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]
"""
  • 컨테이너 연결
# docker run --name nginx-container -d -p 80:80 nginx

# docker ps
"""
CONTAINER ID   IMAGE     COMMAND                   CREATED         STATUS         PORTS                NAMES
39bdeb173dd9   nginx     "/docker-entrypoint.…"    3 seconds ago   Up 2 seconds   0.0.0.0:80->80/tcp   nginx-container
"""

docker network connect my-net nginx-container

docker network inspect my-net
"""
[
    {
        "Name": "my-net",
        "Id": "a0dea5d9b7a4a1f23c8d775bc7f5d0d50e2ae68753ef2abe3ed548a55e5f1c15",
        "Created": "2025-04-17T05:21:13.317311709Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv4": true,
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.21.0.0/16",
                    "Gateway": "172.21.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "39bdeb173dd997b02b0b60fa50ebea83237b20b8e2786d8aa582908f94769dbc": {
                "Name": "nginx-container",
                "EndpointID": "6e9ea77681f038641784719ced9ad745fac369d77fb273272f58ce9b880b84be",
                "MacAddress": "aa:63:e6:ba:d3:e5",
                "IPv4Address": "172.21.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]
"""
  • 컨테이너 연결 해제
docker network disconnect my-net nginx-container

docker network inspect my-net
"""
[
    {
        "Name": "my-net",
        "Id": "a0dea5d9b7a4a1f23c8d775bc7f5d0d50e2ae68753ef2abe3ed548a55e5f1c15",
        "Created": "2025-04-17T05:21:13.317311709Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv4": true,
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.21.0.0/16",
                    "Gateway": "172.21.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]
"""
  • 네트워크 제거
docker network rm my-net

docker network ls
  • 네트워크 청소
docker network prune

 

Network 연결

  • MySQL
docker run --name db-container -d -e MYSQL_ROOT_PASSWORD= mysql

docker ps

docker exec -it db-container /bin/bash

mysql -u root -p

SHOW DATABASES;

exit

exit
# Network
docker network create my-net

docker network ls

docker network connect my-net db-container

docker network inspect my-net
"""
[
    {
        "Name": "my-net",
        "Id": "692e9d9e739808ed01938cbe39cfbf6bbf5519edd5b4943c2144a58cd31a6352",
        "Created": "2025-04-17T06:09:11.456423383Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv4": true,
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "264706c0a2cfd8af3bd284efb6e8bc6e0ef82bb730722a3024fc3ce921900eb8": {
                "Name": "db-container",
                "EndpointID": "9df43d964a217755bae22b8f68f72070a00f114bb790ace43a4b65eb6724e493",
                "MacAddress": "d6:cd:0d:46:bb:df",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]
"""

 

  • Streamlit
# Dockerfile
FROM python:3.12

WORKDIR /app

COPY app.py /app/app.py
COPY .streamlit /app/.streamlit
COPY requirements.txt /app/requirements.txt

RUN pip3 install --upgrade pip && \
    pip3 install -r requirements.txt

EXPOSE 8501

ENTRYPOINT [ "streamlit", "run", "app.py", "--server.port=8501", "--server.address=0.0.0.0" ]
docker build -t streamlit-image .

docker images

docker run --name streamlit-container -d -p 8501:8501 streamlit-image

docker ps
# Network
docker network connect my-net streamlit-container

docker network inspect my-net
"""
[
    {
        "Name": "my-net",
        "Id": "692e9d9e739808ed01938cbe39cfbf6bbf5519edd5b4943c2144a58cd31a6352",
        "Created": "2025-04-17T06:09:11.456423383Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv4": true,
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "264706c0a2cfd8af3bd284efb6e8bc6e0ef82bb730722a3024fc3ce921900eb8": {
                "Name": "db-container",
                "EndpointID": "9df43d964a217755bae22b8f68f72070a00f114bb790ace43a4b65eb6724e493",
                "MacAddress": "d6:cd:0d:46:bb:df",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            },
            "2ac22fc73f272b5cc2da810c6605f0b27c7afe95064367015b041000588df282": {
                "Name": "streamlit-container",
                "EndpointID": "a0555cf88fa6ec11aa91b9c861bb013ffbb84a218eb7dc57858b5266e347f837",
                "MacAddress": "a2:36:56:fc:92:b7",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]
"""
  • 연결 확인

 

 

1-5. Compose

 

Compose

  • 여러 컨테이너를 하나의 서비스처럼 정의하고 관리할 수 있는 도구
  • 복잡한 실행 명령어들을 하나의 docker-compose.yml 파일에 정리해서, 한 줄의 명령어로 시스템 전체를 실행, 중지, 삭제까지 자동화할 수 있다.

 

Compose 항목

  • version
    • Compose 파일 버전 지정
  • services
    • 실행할 컨테이너 정의
  • image
    • 사용할 Docker Image
  • restart
    • 컨테이너 종료 시 재시작 정책 설정
  • environment
    • 환경변수 설정
  • ports
    • 포트 포워딩 설정
  • depends_on
    • 다른 서비스에 대한 의존 관계 설정
  • networks
    • 사용할 네트워크 정의 및 지정

 

Docker Compose

  • docker-compose
# docker-compose.yml
version: '3'

services:
  mysql-service:
    image: mysql
    container_name: db-container
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: r1234
    networks:
      - my-network
  streamlit-service:
    build: .
    container_name: streamlit-container
    restart: always
    ports:
      - "8501:8501"
    depends_on:
      - mysql-service
    networks:
      - my-network

networks:
  my-network:
    driver: bridge
    name: my-net
  • Container 실행
docker-compose up -d

docker images
"""
REPOSITORY                 TAG       IMAGE ID       CREATED          SIZE
docker-streamlit-service   latest    2c5e88e93c2c   56 minutes ago   1.54GB
mysql                      latest    4b2d796bebc2   2 days ago       859MB
"""

docker ps
"""
CONTAINER ID   IMAGE                      COMMAND                   CREATED              STATUS              PORTS                    NAMES
e48cd8612d15   docker-streamlit-service   "streamlit run app.p…"   About a minute ago   Up About a minute   0.0.0.0:8501->8501/tcp   streamlit-container
848e4c2fdbb0   mysql                      "docker-entrypoint.s…"   About a minute ago   Up About a minute   3306/tcp, 33060/tcp      db-container
"""

docker network inspect my-net
"""
[
    {
        "Name": "my-net",
        "Id": "b78bc0e08c6ddd13f8c3a6650afe89243f2dca7f3be5147a00ba192ad4b3e119",
        "Created": "2025-04-17T07:31:40.480158024Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv4": true,
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "848e4c2fdbb0104c6dab9094ef5778e17b2ee62f9998d63f93e9596c4533ce54": {
                "Name": "db-container",
                "EndpointID": "2dadd9e8cce3fdc01cbfc4d3bd59d9682daacb7ccebc0c75cef5fc22d554606d",
                "MacAddress": "92:a6:b3:06:4e:66",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            },
            "e48cd8612d15feb951d5106d04638b7b20bb91d0e3bbf6741588c777e8ad21ad": {
                "Name": "streamlit-container",
                "EndpointID": "45d7b4b42578881b69763d44bbcb8a3cc92c12e83e4cc04273dcc4502f2f62c9",
                "MacAddress": "7a:f3:a5:04:8e:71",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {
            "com.docker.compose.config-hash": "0a413f0519614e47e8917fd02b9ee30e4816d4e6caa357cce90e09515e2f4cc2",
            "com.docker.compose.network": "my-network",
            "com.docker.compose.project": "docker",
            "com.docker.compose.version": "2.34.0"
        }
    }
]
"""
  • 연결 확인

  • Container & Network 삭제
docker-compose down