Set up the repository

  1. Update the apt package index and install packages to allow apt to use a repository over HTTPS:
  2. $ sudo apt-get update
    
    $ sudo apt-get install \
        ca-certificates \
        curl \
        gnupg \
        lsb-release
  3. Add Docker’s official GPG key:
  4. $ sudo mkdir -p /etc/apt/keyrings
    $ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
  5. Use the following command to set up the repository:
  6. $ echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
      $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Install Docker Engine

This procedure works for Debian on x86_64 / amd64, armhf, arm64, and Raspbian.

  1. Update the apt package index, and install the latest version of Docker Engine, containerd, and Docker Compose, or go to the next step to install a specific version:
  2.  
  3.  $ sudo apt-get update
     $ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
  1. To install a specific version of Docker Engine, list the available versions in the repo, then select and install:
    $ apt-cache madison docker-ce
    
      docker-ce | 5:18.09.1~3-0~debian-stretch | https://download.docker.com/linux/debian stretch/stable amd64 Packages
      docker-ce | 5:18.09.0~3-0~debian-stretch | https://download.docker.com/linux/debian stretch/stable amd64 Packages
      docker-ce | 18.06.1~ce~3-0~debian        | https://download.docker.com/linux/debian stretch/stable amd64 Packages
      docker-ce | 18.06.0~ce~3-0~debian        | https://download.docker.com/linux/debian stretch/stable amd64 Packages
    
    b. Install a specific version using the version string from the second column, for example, 5:18.09.1~3-0~debian-stretch .
  2. $ sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io docker-compose-plugin
    
  3. a. List the versions available in your repo:
  4. Verify that Docker Engine is installed correctly by running the hello-world image.This command downloads a test imag
  5. $ sudo docker run hello-world
    

 

To create the docker group and add your user:

  1. Create the docker group.
  2. $ sudo groupadd docker
  3. Add your user to the docker group.
  4. $ sudo usermod -aG docker $USER
  5. Log out and log back in so that your group membership is re-evaluated.On a desktop Linux environment such as X Windows, log out of your session completely and then log back in.
    $ newgrp docker 
    
  6. On Linux, you can also run the following command to activate the changes to groups:
  7. If testing on a virtual machine, it may be necessary to restart the virtual machine for changes to take effect.
  8. Verify that you can run docker commands without sudo.This command downloads a test image and runs it in a container. When the container runs, it prints a message and exits.
    WARNING: Error loading config file: /home/user/.docker/config.json -
    stat /home/user/.docker/config.json: permission denied
    
    To fix this problem, either remove the ~/.docker/ directory (it is recreated automatically, but any custom settings are lost), or change its ownership and permissions using the following commands:
  9. $ sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
    $ sudo chmod g+rwx "$HOME/.docker" -R
    
  10. If you initially ran Docker CLI commands using sudo before adding your user to the docker group, you may see the following error, which indicates that your ~/.docker/ directory was created with incorrect permissions due to the sudo commands.
  11. $ docker run hello-world
    

Configure Docker to start on boot

Most current Linux distributions (RHEL, CentOS, Fedora, Debian, Ubuntu 16.04 and higher) use systemd to manage which services start when the system boots. On Debian and Ubuntu, the Docker service is configured to start on boot by default. To automatically start Docker and Containerd on boot for other distros, use the commands below:

$ sudo systemctl enable docker.service
$ sudo systemctl enable containerd.service

To disable this behavior, use disable instead.

$ sudo systemctl disable docker.service
$ sudo systemctl disable containerd.service

If you need to add an HTTP Proxy, set a different directory or partition for the Docker runtime files, or make other customizations, see customize your systemd Docker daemon options.

'Docker' 카테고리의 다른 글

도커 - web was 구성  (0) 2022.04.21
Docker Compose 네트워크  (0) 2022.04.21
Docker - 네트워크  (0) 2022.04.21
Docker - 파일 저장 위치  (0) 2022.04.19
Install Docker Engine on CentOS  (0) 2022.04.18

docker-compose 로 nginx web 서버와 tomcat was 서버를 구성해 봅니다.

 

[ 설치환경 ]

- OS : CentOS Linux release 7.9.2009

- docker : Docker version 20.10.14

- docker-compose : docker-compose version 1.29.2

 

 

1. docker compose.yml 파일 작성

 

web, was 서버 구동을 위한 docker-compose.yml 파일을 아래와 같이 생성합니다.

- docker-compose.yml

version: '3.8'
services:
    was-example:
        container_name: example_was
        image: was-example:v1.0.0
        environment:
          TZ: "Asia/Seoul"
        ports:
          - "8080:8080"
        restart: always
#        networks:
#          - example-network

    web-example:
        container_name: example_web
        # set env tag version
        image: web-example:latest
        environment:
          TZ: "Asia/Seoul"
        ports:
          - "80:8080"
          - "443:8443"
        restart: always
#        networks:
#          - example-network

#networks:
#  example-network:
#    name: example-net
#    ipam:
#      driver: default
#      config:
#        - subnet: 100.100.0.0/24

 

컨테이너 실행

docker-compose 명령어로 nginx, tomcat 컨테이너를 실행시킵니다.

docker-compose.yml 파일이 있는 경로에서 아래 명령어를 수행합니다.

docker-compose up -d

위 명령어는 명령얼 수행 경로에 존재하는 docker-compose.yml 파일을 읽어 파일에 정의된 일련의 명령어들을 수행합니다. -d 는 백그라운드 프로세스로 수행하라는 옵션입니다.

 

컨테이너가 정상적으로 시작되었는지 확인합니다.

docker ps
CONTAINER ID   IMAGE                COMMAND                  CREATED              STATUS              PORTS                                                                                    NAMES
6a8823cbfbb7   was-example:v1.0.0   "catalina.sh run"        About a minute ago   Up About a minute   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp                                                example_was
70799450d218   web-example:latest   "/docker-entrypoint.…"   About a minute ago   Up About a minute   80/tcp, 0.0.0.0:80->8080/tcp, :::80->8080/tcp, 0.0.0.0:443->8443/tcp, :::443->8443/tcp   example_web

 

컨테이너  중지

docker-compose down

docker-compose.yml 에 정의된 컨테이너를 중지 및 제거합니다. docker ps 명령어를 수행하면 컨테이너가 존재하지 않는 것을 확인할 수 있습니다.

 

참고 : dockerfile 용어정리

FROM base 이미지 설정
WORKDIR 작업 디렉터리 설정
RUN 이미지 빌드 시 커맨드 실행
ENTRYPOINT 이미지 실행 시 항상 실행되야 하는 커맨드 설정
CMD 이미지 실행 시 디폴트 커맨드 또는 파라미터 설정
EXPOSE 컨테이너가 리스닝할 포트 및 프로토콜 설정
COPY/ADD 이미지의 파일 시스템으로 파일 또는 디렉터리 복사
ENV 환경 변수 설정
ARG 빌드 시 넘어올 수 있는 인자 설정

'Docker' 카테고리의 다른 글

docker install on debian  (0) 2022.05.30
Docker Compose 네트워크  (0) 2022.04.21
Docker - 네트워크  (0) 2022.04.21
Docker - 파일 저장 위치  (0) 2022.04.19
Install Docker Engine on CentOS  (0) 2022.04.18

Docker Compose는 여러 개의 컨테이너(container)로 구성된 애플리케이션을 관리하기 위한 간단한 오케스트레이션(Orchestration) 도구입니다. 여러 개의 컨테이너로 구성된 Docker Compose 애플리케이션 내에서 컨테이너 간의 통신에 대해 알아봅니다.

 

디폴트 네트워크

기본적으로 Docker Compose는 하나의 디폴트 네트워크에 모든 컨테이너를 연결합니다. 디폴트 네트워크의 이름은 docker-compose.yml가 위치한 디렉토리 이름 뒤에 _default가 붙습니다. 예를 들어, 디렉토리 이름이 our_app라면 디폴트 네트워크 이름은 our_app_default가 됩니다.

디폴트 네트워크의 이름은 Docker Compose로 애플리케이션을 올릴 때 어렵지 않게 확인할 수 있습니다. 왜냐하면 Compose는 먼저 네트워크를 생성해놓고 각 컨테이너를 구동한 후 네트워크에 연결시키기 때문입니다.

 

$ cd our_app
$ docker-compose up -d
Creating network "our_app_default" with the default driver
Creating our_app_db_1 ... done
Creating our_app_web_1 ... done

Docker Compose로 애플리케이션을 내릴 때는 반대 순서로 컨테이너를 종료/제거한 후 마지막에 네트워크를 제거합니다.

$ docker-compose down
Stopping our_app_web_1 ... done
Stopping our_app_db_1  ... done
Removing our_app_web_1 ... done
Removing our_app_db_1  ... done
Removing network our_app_default
 

애플리케이션이 돌아가고 있는 중에도 Docker 네트워크 목록을 조회하면 디폴트 네트워크가 확인됩니다.

➜  docker network ls
NETWORK ID          NAME                   DRIVER              SCOPE
f1859120a0c3        bridge                 bridge              local
95b00551745b        host                   host                local
1f7202baa40a        none                   null                local
2539640ca106        our_app_default        bridge              local

컨테이너 간 통신

디폴트 네트워크 안에서 컨테이너 간의 통신에서는 서비스의 이름이 호스트명으로 사용됩니다.

예를 들어, web 서비스의 컨테이너에서 db 서비스의 컨테이너를 대상으로 ping 명령어를 날릴 수 있습니다. 디폴트 네트워크 상에서 db 서비스 컨테이너의 IP가 192.168.48.2인 것으로 확인이되네요.

$ docker-compose exec web ping db
PING db (192.168.48.2) 56(84) bytes of data.
64 bytes from our_app_db_1.our_app_default (192.168.48.2): icmp_seq=1 ttl=64 time=0.094 ms
64 bytes from our_app_db_1.our_app_default (192.168.48.2): icmp_seq=2 ttl=64 time=0.162 ms
64 bytes from our_app_db_1.our_app_default (192.168.48.2): icmp_seq=3 ttl=64 time=0.080 ms
64 bytes from our_app_db_1.our_app_default (192.168.48.2): icmp_seq=4 ttl=64 time=0.348 ms
64 bytes from our_app_db_1.our_app_default (192.168.48.2): icmp_seq=5 ttl=64 time=0.195 ms
64 bytes from our_app_db_1.our_app_default (192.168.48.2): icmp_seq=6 ttl=64 time=0.187 ms
 

컨테이넌 간 통신에서 주의할 점은 접속하는 위치가 디폴트 네트워크 내부냐 외부냐에 따라서 포트(port)가 달라질 수 있다는 것입니다.

예를 들어, docker-compose.yml에 web 서비스의 ports 설정이 아래와 같다면,

services:
  web:
    build: .
    ports:
      - "8001:8000"

호스트 컴퓨터에서 접속할 때는 8001 포트를 사용해야 하고, 같은 디폴트 네트워크 내의 다른 컨테이너에서 접속할 때는 포트 8000을 사용해야 합니다.

  • 호스트 컴퓨터에서 web 서비스 컨테이너 접속
$ curl -I localhost:8001
HTTP/1.1 200 OK
Date: Fri, 05 Jun 2020 02:05:10 GMT
Server: WSGIServer/0.2 CPython/3.8.2
Content-Type: text/html
X-Frame-Options: DENY
Content-Length: 16351
X-Content-Type-Options: nosniff
  • 같은 네트워크 내의 다른 컨테이너에서 web 서비스 컨테이너 접속
$ docker-compose exec alpine curl -I web:8000
HTTP/1.1 200 OK
Date: Fri, 05 Jun 2020 02:13:46 GMT
Server: WSGIServer/0.2 CPython/3.8.2
Content-Type: text/html
X-Frame-Options: DENY
Content-Length: 16351
X-Content-Type-Options: nosniff

커스텀 네트워크 추가

Docker Compose는 디플트 네트워크 뿐만 아니라 다른 네트워크도 필요에 따라 추가해줄 수 있습니다.

docker-compose.yml의 networks 항목 아래에 our_net이라는 네트워크를 추가하고, web 서비스의 networks 항목 아래에 our_net 네트워크를 추가하겠습니다. 이렇게 설정을 하게되면 db 서비스는 디폴트 네트워크에만 연결되지만, web 서비스는 디폴트 네트워크 뿐만 아니라 our_net 네트워크에도 연결되게 됩니다.

services:
  web:
    build: .
    ports:
      - "8000:8000"
    networks:
      - default
      - our_net

  db:
    image: postgres
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres

networks:
  our_net:
    driver: bridge

Docker Compose로 애플리케이션을 올려보면 두 개의 네트워크가 생성되는 것을 알 수 있습니다.

$ docker-compose up -d
Creating network "our_app_default" with the default driver
Creating network "our_app_our_net" with driver "bridge"
Creating our_app_db_1 ... done
Creating our_app_web_1 ... done
 
$ our_app docker network ls
NETWORK ID          NAME                   DRIVER              SCOPE
f1859120a0c3        bridge                 bridge              local
95b00551745b        host                   host                local
1f7202baa40a        none                   null                local
2682634e6535        our_app_default        bridge              local
525403b38bbe        our_app_our_net        bridge              local

our_net은 Docker Compose 내부에서 정의된 네트워크 이므로 애플리케이션을 내릴 때 디폴트 네트워크와 함께 삭제됩니다.

$ docker-compose down
Stopping our_app_web_1 ... done
Stopping our_app_db_1  ... done
Removing our_app_web_1 ... done
Removing our_app_db_1  ... done
Removing network our_app_default
Removing network our_app_our_net

외부 네트워크 사용

Docker Compose가 제공하는 디폴트 네트워크 대신에 외부에서 미리 생성해놓은 다른 네트워크를 사용할 수도 있습니다.

먼저 our_net이라는 네트워크를 별도로 생성하겠습니다.

$ docker network create our_net
6d791b927c8c151c45a10ac13c62f3571ecf38a90756fd2ca1c62b7d3de804e8
$ docker network ls
NETWORK ID          NAME                   DRIVER              SCOPE
f1859120a0c3        bridge                 bridge              local
95b00551745b        host                   host                local
1f7202baa40a        none                   null                local
6d791b927c8c        our_net                bridge              local

 

 

그 다음, docker-compose.yml에서 default 네트워크의 external 옵션에 our_net을 설정합니다.

networks:
  default:
    external:
      name: our_net

이제 Docker Compose로 애프리케이션을 올리고, our_net 네트워크의 상세 정보를 확인해보면 Containers 항목에 두 개의 컨테이너가 연결된 것을 볼 수 있습니다.

$ docker-compose up -d
Creating our_app_db_1 ... done
Creating our_app_web_1 ... done
$ docker network inspect our_net
[
    {
        "Name": "our_net",
        "Id": "6d791b927c8c151c45a10ac13c62f3571ecf38a90756fd2ca1c62b7d3de804e8",
        "Created": "2020-06-06T15:55:05.3384403Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.208.0/20",
                    "Gateway": "192.168.208.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "7bcc8194e4018fa48328c6a1aa95a47829c77b850091bebaf1dd6661f5c79df9": {
                "Name": "our_app_db_1",
                "EndpointID": "4f3ffce8c6afc8d3de543859c1671bfe38b897c6e492a1be891de56ec2dfbf90",
                "MacAddress": "02:42:c0:a8:d0:02",
                "IPv4Address": "192.168.208.2/20",
                "IPv6Address": ""
            },
            "dda9d355041adc8f90063e8876fe20a2c804b84b55ece3b6860e3dfb139099c7": {
                "Name": "our_app_web_1",
                "EndpointID": "b0f93bbb39c9eb83d4f286250b90239632667c6b89954d57c9593f32a44c3033",
                "MacAddress": "02:42:c0:a8:d0:03",
                "IPv4Address": "192.168.208.3/20",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

외부에서 생성된 네트워크이므로 Docker Compose 애플리케이션을 내릴 때 해당 네트워크가 함께 삭제되지 않습니다.

$ docker-compose down
Stopping our_app_web_1 ... done
Stopping our_app_db_1  ... done
Removing our_app_web_1 ... done
Removing our_app_db_1  ... done
Network our_net is external, skipping

외부 네트워크를 잘 활용하면 서로 다른 Docker Compose에서 돌아가고 있는 컨테이너 간에도 연결도 가능하게 됩니다. 예를 들어, 첫 번째 Docker Compose의 디폴트 네트워크를 두 번째 Docker Compose의 커스텀 네트워크로 추가해주면, 두 번째 Docker Compose 내의 컨테이너도 첫 번째 Docker Compose의 디폴트 네트워크에 연결될 수 있습니다.

'Docker' 카테고리의 다른 글

docker install on debian  (0) 2022.05.30
도커 - web was 구성  (0) 2022.04.21
Docker - 네트워크  (0) 2022.04.21
Docker - 파일 저장 위치  (0) 2022.04.19
Install Docker Engine on CentOS  (0) 2022.04.18

Docker 컨테이너(container)는 격리된 환경에서 돌아가기 때문에 기본적으로 다른 컨테이너와의 통신이 불가능합니다. 하지만 여러 개의 컨테이너를 하나의 Docker 네트워크(network)에 연결시키면 서로 통신이 가능해집니다. 이번 포스팅에서는 컨테이너 간 네트워킹이 가능하도록 도와주는 Docker 네트워크에 대해서 알아보도록 하겠습니다.

 

네트워크 조회

docker network ls 명령어를 사용하면 현재 생성되어 있는 Docker 네트워크 목록을 조회합니다.

$ docker network ls
NETWORK ID     NAME              DRIVER    SCOPE
26269a11d9ca   bridge            bridge    local
187a5a20afaa   engn001_network   bridge    local
ddbf38931eb2   host              host      local
e2861fc3c87a   none              null      local

bridgehostnone은 Docker 데몬(daemon)이 실행되면서 디폴트로 생성되는 네트워크입니다. 디폴트 네트워크를 이용하는 것 보다는 사용자가 직접 네트워크를 생성해서 사용하는 것이 권장됩니다.(예시, engn001_network)

네트워크 종류

Docker 네트워크는 bridge, host, overlay 등 목적에 따라 다양한 종류의 네트워크 드라이버(driver)를 지원합니다.

  • bridge 네트워크는 하나의 호스트 컴퓨터 내에서 여러 컨테이너들이 서로 소통할 수 있도록 해줍니다.
  • host 네트워크는 컨터이너를 호스트 컴퓨터와 동일한 네트워크에서 컨테이너를 돌리기 위해서 사용됩니다.
  • overlay 네트워크는 여러 호스트에 분산되어 돌아가는 컨테이너들 간에 네트워킹을 위해서 사용됩니다.

본 문서에서는 기본값이고 가장 많이 사용되는 bridge 네트워크에 대해서만 다루도록 하겠습니다.

 

네트워크 생성

먼저 docker network create 커맨드를 사용해서 새로운 Docker 네트워크를 생성해 봅니다.

$ docker network create our-net
e6dfe4a9a5ec85abcb484662c30a3a0fc76df217dde76d52fac39fae8412ca68
$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
143496b94e57        bridge              bridge              local
311d6534f79f        host                host                local
aa89f58200a6        none                null                local
e6dfe4a9a5ec        our-net             bridge              local
추가된 네트워크는 docker network ls 커맨드로 확인할 수 있습니다. -d 옵션을 사용하지 않았기 때문에 기본값인 bridge 네트워크로 생성된 것을 볼 수 있습니다.

네트워크 상세 정보

방금 추가한 네트워크의 상세 정보를 docker network inspect 커맨드로 확인해보도록 하겠습니다.

$ docker network inspect our-net
[
    {
        "Name": "our-net",
        "Id": "e6dfe4a9a5ec85abcb484662c30a3a0fc76df217dde76d52fac39fae8412ca68",
        "Created": "2020-04-26T19:23:04.563643516Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.19.0.0/16",
                    "Gateway": "172.19.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]
Containers 항목을 보면 이 네트워크에 아무 컨테이너도 아직 연결되지 않은 것을 알 수 있습니다.

 

네트워크에 컨테이너 연결

먼저 컨테이너 하나를 one라는 이름으로 실행해보도록 하겠습니다.

$ docker run -itd --name one busybox
660bafdce2996378cde070dfd894731bb90745e46d2ab10d6504c0cc9f4bdea9

컨테이너를 실행할 때 --network 옵션을 명시해주지 않으면, 기본적으로 bridge라는 이름의 디폴트 네트워크에 붙게 됩니다.

$ docker network inspect bridge
(... 생략 ...)
        "Containers": {
            "660bafdce2996378cde070dfd894731bb90745e46d2ab10d6504c0cc9f4bdea9": {
                "Name": "one",
                "EndpointID": "40b4bbd8385debf86eef2fc2136315e1a82fa1ef72877bfae25477d6e8e46726",
                "MacAddress": "02:42:ac:11:00:04",
                "IPv4Address": "172.17.0.4/16",
                "IPv6Address": ""
            },
        },
(... 생략 ...)

이 one 컨테이너를 위에서 생성한 our-net 네트워크에 연결해보도록 하겠습니다. Docker 네트워크에 컨테이너를 연결할 때는 docker network connect 커맨드를 사용합니다.

$ docker network connect our-net one

our-net 네트워크의 상세 정보를 다시 확인해보면 Containers 항목에 one 컨테이너가 추가된 것을 볼 수 있습니다. one 컨테이너에 IP 172.19.0.2가 할당된 것도 확인할 수 있습니다.

$ docker network inspect our-net
[
    {
        "Name": "our-net",
        "Id": "e6dfe4a9a5ec85abcb484662c30a3a0fc76df217dde76d52fac39fae8412ca68",
        "Created": "2020-04-26T19:23:04.563643516Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.19.0.0/16",
                    "Gateway": "172.19.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "660bafdce2996378cde070dfd894731bb90745e46d2ab10d6504c0cc9f4bdea9": {
                "Name": "one",
                "EndpointID": "cc490148a533d40b3aff33a421cc9a01c731c75a8deb70ab729a5358f2fd381c",
                "MacAddress": "02:42:ac:13:00:02",
                "IPv4Address": "172.19.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

네트워크로부터 컨테이너 연결 해제

하나의 컨테이너는 여러 개의 네트워크에 동시에 연결할 수 있습니다. 최초에 one 컨테이너를 생성할 때 bridge 네트워크 붙었기 때문에, 현재 one 컨테이너는 our-net 네트워크와 bridge 네트워크에 동시에 붙어있게 됩니다.

one 컨테이너를 bridge 네트워크로부터 때어 내도록 하겠습니다. Docker 네트워크로부터 컨테이너의 연결을 끊을 때는 docker network disconnect 커맨드를 사용합니다.

$ docker network disconnect bridge one

두번째 컨테이너 연결

하나의 컨테이너를 더 our-net 네트워크에 연결해 봅니다.

이번에는 --network 옵션을 사용해서 컨테이너를 실행하면서 바로 연결할 네트워크를 지정해주도록 하겠습니다.

$ docker run -itd --name two --network our-net busybox
0e7fe8a59f9d3f8bd545d3e557ffd34100a09b8ebe92ae5a375f37a5d072873d

our-net 네트워크의 상세 정보를 확인해보면 two 컨테이너에 IP 172.19.0.3가 할당되어 연결되어 있는 것을 확인할 수 있습니다.

$ docker network inspect our-net
[
    {
        "Name": "our-net",
        "Id": "e6dfe4a9a5ec85abcb484662c30a3a0fc76df217dde76d52fac39fae8412ca68",
        "Created": "2020-04-26T19:23:04.563643516Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.19.0.0/16",
                    "Gateway": "172.19.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "0e7fe8a59f9d3f8bd545d3e557ffd34100a09b8ebe92ae5a375f37a5d072873d": {
                "Name": "two",
                "EndpointID": "a0e3625e48f0b833cd551d6dfb3b1a2a7614f1343adbc5e6aefa860d917ddea9",
                "MacAddress": "02:42:ac:13:00:03",
                "IPv4Address": "172.19.0.3/16",
                "IPv6Address": ""
            },
            "660bafdce2996378cde070dfd894731bb90745e46d2ab10d6504c0cc9f4bdea9": {
                "Name": "one",
                "EndpointID": "cc490148a533d40b3aff33a421cc9a01c731c75a8deb70ab729a5358f2fd381c",
                "MacAddress": "02:42:ac:13:00:02",
                "IPv4Address": "172.19.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

컨테이너 간 네트워킹

이제 두 개의 컨테이너가 네트워크를 통해 서로 소통이 가능한지 테스트를 해보도록 하겠습니다.

먼저 one 컨테이너에서 two 컨테이너를 상대로 ping 명령어를 날려보겠습니다. 컨테이너 이름을 호스트네임(hostname)처럼 사용할 수 있습니다.

 

$ docker exec one ping two
PING two (172.19.0.3): 56 data bytes
64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.119 ms
64 bytes from 172.19.0.3: seq=1 ttl=64 time=0.105 ms
64 bytes from 172.19.0.3: seq=2 ttl=64 time=0.116 ms
64 bytes from 172.19.0.3: seq=3 ttl=64 time=0.883 ms
64 bytes from 172.19.0.3: seq=4 ttl=64 time=0.127 ms

반대로 two 컨테이너에서 one 컨테이너를 상대로 ping 명령어를 날려보겠습니다. 이번에는 컨테이너 이름 대신에 IP를 사용하겠습니다.

$ docker exec two ping 172.19.0.2
PING 172.19.0.2 (172.19.0.2): 56 data bytes
64 bytes from 172.19.0.2: seq=0 ttl=64 time=0.927 ms
64 bytes from 172.19.0.2: seq=1 ttl=64 time=0.079 ms
64 bytes from 172.19.0.2: seq=2 ttl=64 time=0.080 ms
64 bytes from 172.19.0.2: seq=3 ttl=64 time=0.079 ms
64 bytes from 172.19.0.2: seq=4 ttl=64 time=0.107 ms

네트워크 제거

마지막으로 docker network rm 커맨드를 사용해서 our-net 네트워크를 제거해보겠습니다.

$ docker network rm our-net
Error response from daemon: error while removing network: network our-net id e6dfe4a9a5ec85abcb484662c30a3a0fc76df217dde76d52fac39fae8412ca68 has active endpoints

위와 같이 제거하려는 네트워크 상에서 실행 중인 컨테이너가 있을 때는 제거가 되지가 않습니다.

그럴 때는 해당 네트워크에 연결되어 실행 중인 모든 컨테이너를 먼저 중지 시키고, 네트워크를 삭제해야 합니다.

$ docker stop one two
one
two
$ docker network rm our-net
our-net

네트워크 정리

하나의 호스트 컴퓨터에서 다수의 컨테이너를 돌리다 보면 아무 컨테이너도 연결되어 있지 않은 네트워크가 존재할 수 있습니다. 이럴 때는 docker network prune 커맨드를 이용해서 불필요한 네트워크를 한번에 모두 제거할 수 있습니다.

$ docker network prune
WARNING! This will remove all networks not used by at least one container.
Are you sure you want to continue? [y/N] y

원문 : https://www.daleseo.com/docker-networks/

 

[ 참고 ]

Docker는 독립 된 네트워크를 구성 하기위하여 3가지 기술을 사용 합니다.

 

  1) network namespace

    - contianer안의 NIC와 Container의 NIC와 pair 되는 VNIC를 만드는데 사용 합니다.

    * 자세한 설명(실습가능) : https://www.joinc.co.kr/w/man/12/NetworkNamespace#toc

 

  2) bridge

    - llinux에서 software로 구현 한 bridge

    - bridge하나 당 개별 네트워크를 구성 할 수 있습니다.

    - container에 bridge를 2개 할 당하면 Container는 2개의 NIC를 가질 수 있습니다.

    - L2 통신만을 지원 합니다.

 

  3) iptables

    - Container가 외부 네트워크 통신을 하기 위해서 사용 됩니다.

    - NAPT를 이용하여 통신을 한다.

    *NAPT 란 ?

      - 내부 사설 IP와 Port를 공용 IP와 Port로 변경 시켜주는 기능입니다. NAPT는 Network Address Port Translation의 약자로, NAT에서는 발신자의 사설망-외부망 IP를 바꿔서 보내주는 역할만을 수행했다면 이제는 포트까지 바꿔서 보내는 역할을 합니다. NAPT의 테이블은 NAT의 테이블에서 Port에 해당하는 컬럼이 추가됩니다. 

 

 - 네트워크 대역 지정

    (1) 사용자 정의 네트워크를 생성시 IP 대역을 지정할 수 있습니다. 

      #docker network create 

        --driver=bridge \

        --subnet=172.1.0.0/16 \

        --ip-range=172.1.0.0/24 \

        --gateway=172.1.0.1 \

        mybridge

 - Container IP 설정

    (1) container 생성시 설정

       #docker run -itd --ip 172.1.0.5 --net=mybridge --name=centos-network-1 centos

       --ip  : container에 할당 할 IP 설정

       --net : container 할당 할 IP가 속해 있는 network 대역을 가진 bridge 설정

 

 

 

'Docker' 카테고리의 다른 글

도커 - web was 구성  (0) 2022.04.21
Docker Compose 네트워크  (0) 2022.04.21
Docker - 파일 저장 위치  (0) 2022.04.19
Install Docker Engine on CentOS  (0) 2022.04.18
Run the Docker daemon as a non-root user (Rootless mode)  (0) 2022.04.18

Where are Docker Images Stored? Docker Container Paths Explained

 

다음을 실행하여 Docker 구성에 대한 기본 정보를 얻을 수 있습니다.

$ docker info

...
 Storage Driver: overlay2
...
 Docker Root Dir: /var/lib/docker
...

출력에는 스토리지 드라이버 및 도커 루트 디렉토리에 대한 정보가 포함됩니다.

 

도커 이미지와 컨테이너 저장소 위치

Docker 컨테이너는 네트워크 설정, 볼륨 및 이미지로 구성됩니다. Docker 파일의 위치는 운영 체제에 따라 다릅니다. 다음은 가장 많이 사용되는 운영 체제에 대한 개요입니다.

  • Ubuntu: /var/lib/docker/
  • Fedora: /var/lib/docker/
  • Debian: /var/lib/docker/
  • Windows: C:\ProgramData\DockerDesktop, C:\Program Files\Docker\Docker
  • MacOS: ~/Library/Containers/com.docker.docker/Data/vms/0/

[참고] docker 디렉토리 구조

[root@docker]# tree -L 1
├── buildkit
├── containers
├── image
├── network
├── overlay2
├── plugins
├── runtimes
├── swarm
├── tmp
├── trust
└── volumes

 

macOS 및 Windows에서 Docker는 가상 환경에서 Linux 컨테이너를 실행합니다. 몇 가지 추가로 알아야 할 사항이 있습니다.

 

Docker for Mac

Docker는 기본적으로 macOS와 호환되지 않으므로 Hyperkit을 사용하여 가상 이미지를 실행합니다. 가상 이미지 데이터는 다음 위치에 있습니다.

~/Library/Containers/com.docker.docker/Data/vms/0

 

가상 이미지 내에서 경로는 기본 Docker 경로 /var/lib/docker입니다.
가상 환경에서 셸을 만들어 Docker 루트 디렉터리를 조사할 수 있습니다.

$ screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty 

Ctrl+a를 누른 다음 k 및 y를 눌러 이 세션을 종료할 수 있습니다.

Docker for Windows

Windows에서 Docker는 약간 세분화되어 있습니다. Linux 컨테이너와 유사하게 작동하는 기본 Windows 컨테이너가 있습니다. Linux 컨테이너는 최소한의 Hyper-V 기반 가상 환경에서 실행됩니다.

Linux 이미지를 실행하기 위한 구성 및 가상 이미지는 기본 Docker 루트 폴더에 저장됩니다.

C:\ProgramData\DockerDesktop

 

 

도커 inspect

 

예시로, nginx 도커 image를 실행합니다.

docker run -it -d nginx

이미지를 검사하면 다음과 같은 경로가 표시됩니다.

$ docker inspect nginx

...
"LowerDir": "/var/lib/docker/overlay2/..ab/diff:/var/lib/docker/overlay2/..be/diff:/var/lib/docker/overlay2/..ef/diff:/var/lib/docker/overlay2/..a5/diff:/var/lib/docker/overlay2/..4e/diff",
"MergedDir": "/var/lib/docker/overlay2/..0b/merged",
"UpperDir": "/var/lib/docker/overlay2/..0b/diff",
"WorkDir": "/var/lib/docker/overlay2/..0b/work"
...

 

 

도커 이미지의 참조 위치로 이동할 수 있습니다.

$ cd /var/lib/docker/overlay2/..0b/

$ ls -lah
drwx--x---.  5 root root   69 Apr 19 11:25 .
drwx--x---. 33 root root 4096 Apr 19 11:25 ..
drwxr-xr-x.  6 root root   51 Apr 18 13:58 diff
-rw-r--r--.  1 root root   26 Apr 18 13:58 link
-rw-r--r--.  1 root root  492 Apr 18 13:58 lower
drwxr-xr-x.  1 root root   51 Apr 18 13:58 merged
drwx------.  3 root root   18 Apr 19 11:25 work

 

 

도커 root 폴더 구조

/var/lib/docker 내부에는 다양한 정보가 저장됩니다. 예를 들어 컨테이너, 볼륨, 빌드, 네트워크 및 클러스터에 대한 데이터입니다.

$ ls -la /var/lib/docker

total 152
drwx--x--x   15 root     root          4096 Feb  1 13:09 .
drwxr-xr-x   13 root     root          4096 Aug  1  2019 ..
drwx------    2 root     root          4096 May 20  2019 builder
drwx------    4 root     root          4096 May 20  2019 buildkit
drwx------    3 root     root          4096 May 20  2019 containerd
drwx------    2 root     root         12288 Feb  3 19:35 containers
drwx------    3 root     root          4096 May 20  2019 image
drwxr-x---    3 root     root          4096 May 20  2019 network
drwx------    6 root     root         77824 Feb  3 19:37 overlay2
drwx------    4 root     root          4096 May 20  2019 plugins
drwx------    2 root     root          4096 Feb  1 13:09 runtimes
drwx------    2 root     root          4096 May 20  2019 swarm
drwx------    2 root     root          4096 Feb  3 19:37 tmp
drwx------    2 root     root          4096 May 20  2019 trust
drwx------   15 root     root         12288 Feb  3 19:35 volumes

 

Docker images

기본 스토리지 드라이버 오버레이2를 사용하는 경우 Docker 이미지는 /var/lib/docker/overlay2에 저장됩니다. 여기에서 Docker 이미지의 읽기 전용 레이어와 변경 사항이 포함된 그 위에 있는 레이어를 나타내는 다양한 파일을 찾을 수 있습니다.

예제를 사용하여 콘텐츠를 살펴보겠습니다.

$ docker image pull nginx
$ docker image inspect nginx

[
    {
        "Id": "sha256:207...6e1",
        "RepoTags": [
            "nginx:latest"
        ],
        "RepoDigests": [
            "nginx@sha256:ad5...c6f"
        ],
        "Parent": "",
 ...
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 126698063,
        "VirtualSize": 126698063,
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/585...9eb/diff:
                             /var/lib/docker/overlay2/585...9eb/diff",
                "MergedDir": "/var/lib/docker/overlay2/585...9eb/merged",
                "UpperDir": "/var/lib/docker/overlay2/585...9eb/diff",
                "WorkDir": "/var/lib/docker/overlay2/585...9eb/work"
            },
...

LowerDir은 이미지의 읽기 전용 레이어를 포함합니다. 변경 사항을 나타내는 읽기-쓰기 계층은 UpperDir의 일부입니다. 이미지를 변경한 경우에 NGINX UpperDir 폴더에 다음과 같은 로그 파일이 있을 수 있습니다.

$ ls -la /var/lib/docker/overlay2/585...9eb/diff

total 8
drwxr-xr-x    2 root     root    4096 Feb  2 08:06 .
drwxr-xr-x    3 root     root    4096 Feb  2 08:06 ..
lrwxrwxrwx    1 root     root      11 Feb  2 08:06 access.log -> /dev/stdout
lrwxrwxrwx    1 root     root      11 Feb  2 08:06 error.log -> /dev/stderr

MergedDir은 Docker에서 컨테이너를 실행하는 데 사용하는 UpperDir 및 LowerDir의 결과를 나타냅니다. WorkDir은 오버레이2의 내부 디렉토리이며 비어 있어야 합니다.

 

Docker Volumes

컨테이너에 영구 저장소를 추가하여 데이터를 컨테이너가 존재하는 것보다 더 오래 유지하거나 볼륨을 호스트 또는 다른 컨테이너와 공유할 수 있습니다. -v 옵션을 사용하여 볼륨으로 컨테이너를 시작할 수 있습니다.

아래와 같이 컨테이너를 실행 후 접속합니다. 접속 후 볼륨을 확인합니다.

$ docker run -d --name nginx_container -v /var/log nginx
$ docker exec -it nginx_container bash

## container 볼륨확인
# df -H
root@4078597b1af7:/# df -H
Filesystem      Size  Used Avail Use% Mounted on
...
/dev/sda2        22G  3.5G   18G  17% /var/log
...

위와 같이 볼륨이 마운트된 것을 확인 할 수 있습니다.

 

참조된 디렉토리에는 NGINX 컨테이너의 /var/log 위치에 있는 파일이 포함되어 있습니다.

$ ls -lah /var/lib/docker/volumes/1e4...d9c/_data

total 88
drwxr-xr-x    4 root     root        4.0K Feb  3 21:02 .
drwxr-xr-x    3 root     root        4.0K Feb  3 21:02 ..
drwxr-xr-x    2 root     root        4.0K Feb  3 21:02 apt
-rw-rw----    1 root     43             0 Jan 30 00:00 btmp
-rw-r--r--    1 root     root       34.7K Feb  2 08:06 dpkg.log
-rw-r--r--    1 root     root        3.2K Feb  2 08:06 faillog
-rw-rw-r--    1 root     43         29.1K Feb  2 08:06 lastlog
drwxr-xr-x    2 root     root        4.0K Feb  3 21:02 nginx
-rw-rw-r--    1 root     43             0 Jan 30 00:00 w

 

Clean up space used by Docker

Docker 명령을 사용하여 사용하지 않는 컨테이너를 정리하는 것이 좋습니다. 컨테이너, 네트워크, 이미지 및 빌드 캐시는 다음을 실행하여 정리할 수 있습니다.

$ docker system prune -a

다음을 실행하여 사용하지 않는 볼륨을 제거할 수도 있습니다.

docker volume prune

 

'Docker' 카테고리의 다른 글

Docker Compose 네트워크  (0) 2022.04.21
Docker - 네트워크  (0) 2022.04.21
Install Docker Engine on CentOS  (0) 2022.04.18
Run the Docker daemon as a non-root user (Rootless mode)  (0) 2022.04.18
docker compose 설치  (0) 2022.03.18

Install Docker Engine on CentOS

Prerequisites

OS requirements

Docker Engine을 설치하려면 CentOS 7 또는 8 버전이 필요합니다.

centos-extras 저장소를 활성화해야 합니다. 이 리포지토리는 기본적으로 활성화되어 있지만 비활성화한 경우 활성화해야 합니다.
오버레이2 스토리지 드라이버를 권장합니다.

Uninstall old versions

이전 버전의 Docker는 docker 또는 docker-engine이라고 했습니다. 이전 버전이 설치된 경우 관련 종속성과 함께 제거합니다.

 sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

 

이미지, 컨테이너, 볼륨 및 네트워크를 포함한 /var/lib/docker/의 내용은 보존됩니다. Docker 엔진 패키지는 이제 docker-ce라고 합니다.

 

Installation methods

필요에 따라 다양한 방식으로 Docker 엔진을 설치할 수 있습니다.

대부분의 사용자는 간편한 설치 및 업그레이드 작업을 위해 Docker의 리포지토리를 설정하고 이 리포지토리에서 설치합니다. 이것이 권장되는 접근 방식입니다.

일부 사용자는 RPM 패키지를 다운로드하여 수동으로 설치하고 업그레이드를 완전히 수동으로 관리합니다. 이는 인터넷에 액세스할 수 없는 시스템에 Docker를 설치하는 것과 같은 상황에서 유용합니다.

Install using the repository

새 호스트 시스템에 처음으로 Docker Engine을 설치하기 전에 Docker 저장소를 설정해야 합니다. 그런 다음 저장소에서 Docker를 설치하고 업데이트할 수 있습니다.

Set up the repository

yum-utils 패키지(yum-config-manager 유틸리티 제공)를 설치하고 안정적인 저장소를 설정합니다.

$ sudo yum install -y yum-utils

$ sudo yum-config-manager --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

 

Install Docker Engine

최신 버전의 Docker 엔진 및 containerd를 설치하거나 다음 단계로 이동하여 특정 버전을 설치합니다.

$ sudo yum install docker-ce docker-ce-cli containerd.io

GPG 키를 수락하라는 메시지가 표시되면 지문이 060A 61C5 1B55 8A7F 742B 77AA C52F EB6B 621E 9F35와 일치하는지 확인하고 일치하는 경우, 수락합니다. 이 명령은 Docker를 설치하지만 Docker를 시작하지 않습니다. 또한 도커 그룹을 생성하지만 기본적으로 그룹에 사용자를 추가하지 않습니다.

a. 특정 버전의 Docker Engine을 설치하려면 리포지토리에 사용 가능한 버전을 확인하고 설치를 원하는 버전을 선택하여 설치합니다.

리포지토리에서 사용 가능한 버전을 나열하고 정렬합니다. 이 예에서는 버전 번호별로 결과를 가장 높은 것에서 가장 낮은 것으로 정렬하여 보여줍니다.

$ yum list docker-ce --showduplicates | sort -r

docker-ce.x86_64         3:20.10.9-3.el7                       docker-ce-test
docker-ce.x86_64         3:20.10.9-3.el7                       docker-ce-stable
docker-ce.x86_64         3:20.10.8-3.el7                       docker-ce-test
docker-ce.x86_64         3:20.10.8-3.el7                       docker-ce-stable
docker-ce.x86_64         3:20.10.7-3.el7                       docker-ce-test
docker-ce.x86_64         3:20.10.7-3.el7                       docker-ce-stable
docker-ce.x86_64         3:20.10.6-3.el7                       docker-ce-test

 

표시되는 목록은 활성화된 리포지토리에 따라 다르며 CentOS 버전에 따라 다릅니다(이 예에서 .el7 접미사로 표시됨).

docker 설치시 docker-ce-설치버전명으로

패키지 이름(docker-ce)에 첫 번째 콜론(:)에서 하이픈('-' )전까지의 글자(버전)를 조합하여 사용합니다.

(예시 : docker-ce.x86_64 3:20.10.9-3.el7 --> docker-ce-20.10.9)

$ sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
-- version docker-ce-20.10.9 설치 예
$ sudo yum install docker-ce-20.10.9 docker-ce-cli-20.10.9 containerd.io

위 명령은 Docker를 설치하지만 Docker를 시작하지 않습니다. 또한 도커 그룹을 생성하지만 기본적으로 그룹에 사용자를 추가하지 않습니다.

Start Docker.

$ sudo systemctl start docker

hello-world 이미지를 실행하여 Docker 엔진이 올바르게 설치되었는지 확인합니다. 이 명령은 이미지를 다운로드하고 컨테이너에서 실행합니다. 컨테이너가 실행되면 메시지를 출력하고 종료합니다.

$ sudo docker run hello-world

$ sudo docker ps -a
## result
CONTAINER ID   IMAGE         COMMAND    CREATED          STATUS                      PORTS     NAMES
3787345296b7   hello-world   "/hello"   11 seconds ago   Exited (0) 11 seconds ago             pedantic_jang

 

sudo를 사용하여 Docker 명령을 실행합니다.

root 권한이 없는 사용자가 Docker 명령을 실행할 수 있도록 Linux 사후 설치(Linux postinstall\)를 합니다.

 

Post-installation steps for Linux

non-root user 로 도커 관리

Docker 데몬은 TCP 포트 대신 Unix 소켓에 바인딩합니다. 기본적으로 Unix 소켓은 사용자 루트가 소유하고 다른 사용자는 sudo를 통해서만 액세스할 수 있습니다. Docker 데몬은 항상 루트 사용자로 실행됩니다.

docker 명령 앞에 sudo를 사용하지 않으려면 docker라는 Unix 그룹을 만들고 여기에 사용자를 추가합니다. Docker 데몬이 시작되면 docker 그룹의 구성원이 액세스할 수 있는 Unix 소켓을 만듭니다.

 

To run Docker without root privileges, see Run the Docker daemon as a non-root user (Rootless mode).

 

토커 그룹 생성과 사용자 추가

- docker 그룹 생성(docker 설치 시 생성되므로 생략합니다.)

$ sudo groupadd docker

- docker 그룹에 사용자 추가

 $ sudo usermod -aG docker $USER

현재의 user에는 추가된 그룹이 적용되지 않으므로 로그아웃했다가 다시 로그인하여 그룹 구성원 자격을 적용합니다.
가상 머신에서 테스트하는 경우 변경 사항을 적용하려면 가상 머신을 다시 시작해야 할 수도 있습니다.

X Windows와 같은 데스크톱 Linux 환경에서는 세션에서 완전히 로그아웃한 다음 다시 로그인합니다.
Linux에서는 다음 명령을 실행하여 그룹에 대한 변경 사항을 활성화할 수도 있습니다.

## 현재 사용자의 group을 확인
$ groups

## 현재 사용자를 docker group에 추가
$ newgrp docker

## 현재 사용자의 group을 확인
$ groups

 

sudo 없이 docker 명령을 실행할 수 있는지 확인합니다.

 docker run hello-world

 

부팅 시 docker 자동 기동

대부분의 최신 Linux 배포판(RHEL, CentOS, Fedora, Debian, Ubuntu 16.04 이상)은 systemd를 사용하여 시스템 부팅 시 시작되는 서비스를 관리합니다. Debian 및 Ubuntu에서 Docker 서비스는 기본적으로 부팅 시 시작되도록 구성됩니다. 다른 배포판의 부팅 시 Docker 및 Containerd를 자동으로 시작하려면 아래 명령을 수행합니다.

$ sudo systemctl enable docker.service
$ sudo systemctl enable containerd.service

 

자동 시작을을 비활성화합니다.

$ sudo systemctl disable docker.service
$ sudo systemctl disable containerd.service

 

 

 

'Docker' 카테고리의 다른 글

Docker - 네트워크  (0) 2022.04.21
Docker - 파일 저장 위치  (0) 2022.04.19
Run the Docker daemon as a non-root user (Rootless mode)  (0) 2022.04.18
docker compose 설치  (0) 2022.03.18
Docker Image 만들기  (0) 2022.02.22

Run the Docker daemon as a non-root user (Rootless mode)

루트리스 모드를 사용하면 루트가 아닌 사용자로 Docker 데몬 및 컨테이너를 실행하여 데몬 및 컨테이너 런타임의 잠재적인 취약성을 완화할 수 있습니다.
루트리스 모드는 전제 조건이 충족되는 한 Docker 데몬 설치 중에도 루트 권한이 필요하지 않습니다.
루트리스 모드는 실험적 기능으로 Docker Engine v19.03에 도입되었습니다. Rootless 모드는 Docker Engine v20.10에서 실험 단계를 마쳤습니다.

 

작동 원리
루트리스 모드는 사용자 네임스페이스 내에서 Docker 데몬과 컨테이너를 실행합니다. 이것은 userns-remap 모드에서 데몬 자체가 루트 권한으로 실행되는 반면 루트리스 모드에서는 데몬과 컨테이너가 모두 루트 권한 없이 실행된다는 점을 제외하고는 userns-remap 모드와 매우 유사합니다.

루트리스 모드는 사용자 네임스페이스에서 여러 UID/GID를 사용할 수 있도록 하는 데 필요한 newuidmap 및 newgidmap을 제외하고 SETUID 비트 또는 파일 기능이 있는 바이너리를 사용하지 않습니다.

 

Prerequisites

호스트에 newuidmap 및 newgidmap을 설치해야 합니다. 이러한 명령은 대부분의 배포판에서 uidmap 패키지에 의해 제공됩니다.
/etc/subuid 및 /etc/subgid에는 사용자에 대한 최소 65,536개의 하위 UID/GID가 포함되어야 합니다. 다음 예에서 사용자 testuser는 65,536개의 하위 UID/GID(231072-296607)를 가지고 있습니다.

id -u
1001
$ whoami
testuser
$ grep ^$(whoami): /etc/subuid
testuser:231072:65536
$ grep ^$(whoami): /etc/subgid
testuser:231072:65536

 

CentOS 7 and RHEL 7

  • Add user.max_user_namespaces=28633 to /etc/sysctl.conf (or /etc/sysctl.d) and run sudo sysctl --system
  • systemctl --user does not work by default. Run dockerd-rootless.sh directly without systemd.

 

Install

Note

Docker 데몬이 이미 실행 중이면 비활성화 시킵니다.

$ sudo systemctl disable --now docker.service docker.socket

 

With packages(RPM/DEB)

RPM/DEB 패키지와 함께 Docker 20.10 이상을 설치했다면 /usr/bin에 dockerd-rootless-setuptool.sh가 있어야 합니다.
루트가 아닌 사용자로 dockerd-rootless-setuptool.sh install을 실행하여 데몬을 설정합니다.

 

without packages

apt-get 및 dnf와 같은 패키지 관리자를 실행할 권한이 없는 경우 https://get.docker.com/rootless에서 제공되는 설치 스크립트를 사용하는 것이 좋습니다. s390x에서는 정적 패키지를 사용할 수 없으므로 s390x에서는 지원되지 않습니다.

 curl -fsSL https://get.docker.com/rootless | sh
...
[INFO] Creating /home/testuser/.config/systemd/user/docker.service
...
[INFO] Installed docker.service successfully.
[INFO] To control docker.service, run: `systemctl --user (start|stop|restart) docker.service`
[INFO] To run docker.service on system startup, run: `sudo loginctl enable-linger testuser`

[INFO] Make sure the following environment variables are set (or add them to ~/.bashrc):

export PATH=/home/testuser/bin:$PATH
export DOCKER_HOST=unix:///run/user/1000/docker.sock

The binaries will be installed at ~/bin.

 

Uninstall

Docker 데몬의 systemd 서비스를 제거하려면 dockerd-rootless-setuptool.sh uninstall을 실행합니다.

 dockerd-rootless-setuptool.sh uninstall
+ systemctl --user stop docker.service
+ systemctl --user disable docker.service
Removed /home/testuser/.config/systemd/user/default.target.wants/docker.service.
[INFO] Uninstalled docker.service
[INFO] This uninstallation tool does NOT remove Docker binaries and data.
[INFO] To remove data, run: `/usr/bin/rootlesskit rm -rf /home/testuser/.local/share/docker`

~/.bashrc에 추가한 경우 환경 변수 PATH 및 DOCKER_HOST를 설정 해제합니다.

데이터 디렉토리를 제거하려면 rootlesskit rm -rf ~/.local/share/docker를 실행합니다.

바이너리를 제거하려면 패키지 관리자와 함께 Docker를 설치한 경우, 
docker-ce-rootless-extras 패키지를 제거합니다. 

https://get.docker.com/rootless(패키지 없이 설치)로 Docker를 설치한 경우 ~/bin 아래의 바이너리 파일을 제거합니다. 

 

cd ~/bin
$ rm -f containerd containerd-shim containerd-shim-runc-v2 ctr docker docker-init docker-proxy dockerd dockerd-rootless-setuptool.sh dockerd-rootless.sh rootlesskit rootlesskit-docker-proxy runc vpnkit

 

'Docker' 카테고리의 다른 글

Docker - 파일 저장 위치  (0) 2022.04.19
Install Docker Engine on CentOS  (0) 2022.04.18
docker compose 설치  (0) 2022.03.18
Docker Image 만들기  (0) 2022.02.22
podman Error Message ERRO[0000]  (0) 2022.01.13

Install Compose on Linux

On Linux, you can download the Docker Compose binary from the Compose repository release page on GitHub. Follow the instructions from the link, which involve running the curl command in your terminal to download the binaries. These step-by-step instructions are also included below.

Linux에서는 GitHub의 Compose 리포지토리 릴리스 페이지에서 Docker Compose 바이너리를 다운로드할 수 있습니다. 터미널에서 curl 명령을 실행하여 바이너리를 다운로드하는 것과 관련된 링크의 지침을 따르십시오. 이러한 단계별 지침도 아래에 포함되어 있습니다.

 

 

다음 명령을 실행하여 Docker Compose의 안정적인 릴리스를 다운로드합니다.

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

 

바이너리에 실행 권한을 적용합니다.

sudo chmod +x /usr/local/bin/docker-compose

 

설치 버전을 확인합니다.

$ docker-compose --version

docker-compose version 1.29.2, build 5becea4c

'Docker' 카테고리의 다른 글

Install Docker Engine on CentOS  (0) 2022.04.18
Run the Docker daemon as a non-root user (Rootless mode)  (0) 2022.04.18
Docker Image 만들기  (0) 2022.02.22
podman Error Message ERRO[0000]  (0) 2022.01.13
Docker Compose란  (1) 2022.01.07

+ Recent posts