2022-11-01 · 4

도커에 대한 기본 사용 설명

docker

이 글은 작성된 지 2년이 넘었어요. 내용이 오래됐을 수 있어요.

도커 설치

sudo apt-get update
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
    
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  
  sudo apt-get update

만약 apt-get update가 오류가 난다면 아래 명령어를 입력해주면 됩니다.

sudo chmod a+r /etc/apt/keyrings/docker.gpg
sudo apt-get update

그 후 아래 명령어로 설치를 완료합니다

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

도커 운영체제 다운받기

docker pull <image>:<version>

그냥 원하는거 대충치니까 다 되더라구요. docker pull ubuntu:20.04 와 같이 입력하면 됩니다.

docker images

위 명령어로 다운받은 이미지를 확인할 수 있습니다.

도커 실행시키기

docker run -itd --name <name> --net <network adapter> -p <src port>:<dst port> [-p...] <image name> /bin/bash

좀 길게 쓰는 위와 같이 사용이 가능합니다. 이렇게 만든 컨테이너를 아래 명령어를 통해 들어갈 수 있습니다.

docker attach <container name || container ID>

OR

docker exec -it <container name || container ID> /bin/bash

docker exec -it server /bin/bash

그리고 빠져나올 때 exit를 치고 나오게 되면 컨테이너가 종료되게 됩니다. 이걸 원치않으면 control + p + q를 입력해주면 그냥 나와지게 됩니다.

docker ps [ -a]

위 명령어로 현재 실행되고 있는 컨테이너를 볼 수 있습니다.

docker ps

docker stop <container name || container ID>

docker rm <container name || container ID>

docker start <container name || container ID>

현재 실행되고 있는 컨테이너를 stop으로 중지 시킬 수 있습니다. 하지만 중지시킨다고 끝이 아닙니다. docker ps -a로 확인했을 때 남아있기 때문에 새롭게 생성이 안될 것 입니다. 이럴 때 rm으로 완전히 삭제시켜줍니다. 만약 실수로 exit같은걸 쳐서 나와버렸을 땐 start로 다시 실행시킬 수 있습니다.

근데 이제 막상 컨테이너에 들어가면 vim도 없고 ifconfig도 없고 systemctl도 없고 그런데 아래와 같은 명령어로 하면 systemctl은 해결이 가능합니다.

docker run -itd --name server --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro --net Anet -p 0.0.0.0:2222:22 -p 0.0.0.0:80:80 -p 0.0.0.0:53:53 ubuntu20 /usr/sbin/init

--privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro 이부분과 /usr/sbin/init은 필수로 들어가야합니다. 권한을 준다고 생각하면 편합니다.

포트를 0.0.0.0:2222:22 이런식으로 옵션을 주게되면 이 도커 서버안에서의 ssh는 22포트지만 외부에서 접속을 하기 위해서는 2222포트로 접속을 하면 포트포워딩으로 도커 안 22포트로 넘겨주게 됩니다.

위 사진과 같이 systemctl 명령어가 잘 먹히는 것을 볼 수 있습니다. 이래야지 systemctl enable <service>가 가능해서 컨테이너를 실행 시키자마자 서비스들도 켜지게 됩니다.

도커 네트워크 관리

현재 지금 있는 네트워크에 대한걸 보여줍니다. docker run 명령어에서 --net <NETWORK ID | NAME>를 적지 않았을 때 기본적으로 bridge로 설정됩니다. 만약 이럴 때 기본 도커의 가장 ipv4는 아래와 같습니다

docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
    inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
    inet6 fe80::42:b4ff:fe53:a7a7  prefixlen 64  scopeid 0x20<link>
    ether 02:42:b4:53:a7:a7  txqueuelen 0  (Ethernet)
    RX packets 1323  bytes 56348 (56.3 KB)
    RX errors 0  dropped 0  overruns 0  frame 0
    TX packets 1522  bytes 1821313 (1.8 MB)
    TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

172.17.0.1이고 기본적으로 net를 설정해주지 않으면 저기서 172.17.0.2와 같이 하나씩 늘어나게 됩니다.

아래는 네트워크를 생성하는 명령어 입니다.

docker network create --subnet <network arange> --gateway <gateway Ipv4> <NETWORK NAME>

예시로 docker network create --subnet 192.168.10.0/24 --gateway 192.168.10.254 netcard 와 같이 입력하면 설정한 IP대로 만들어지고 docker run --net netcard 이런식으로 들어게 되면 IP가 192.168.10.1과 같이 들어가게 됩니다.

위에서 예시로 만든 것의 IP를 보여드리겠습니다.

root@ubuntu:~# docker inspect Anet
[
    {
        "Name": "Anet",
        "Id": "56c10b9b13534d94e05af9cd430fab03bf6cdb6ee11e0978c12a96b0833f73ad",
        "Created": "2022-11-01T14:21:51.268503946+09:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "10.211.0.0/24",
                    "Gateway": "10.211.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "a9477816e0a083260fbe53bfc50fc2603669da7fbee6979c80cf0df1d03dab36": {
                "Name": "server",
                "EndpointID": "7aca5c8a4b0ecad82cb435819ec1ea96c5dab7ab74cb50f1b74992e3971ec59f",
                "MacAddress": "02:42:0a:d3:00:02",
                "IPv4Address": "10.211.0.2/24",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

IPv4에 대한 정보는 위 JSON과 같고 10.211.0.1이 gateway이기 때문에 ipv4는 10.211.0.2부터 할당된 것을 볼 수 있습니다. 위와 같은 JSON정보를 알기 위해서는 **docker inspect <원하는 정보의 ID>**를 입력하시면 됩니다. 컨테이너도 되고 네트워크도 됩니다.

이후에도 --link와 같은 것도 존재합니다. 이정도만 알아도 도커의 기능은 다 쓸 수 있을거 같습니다


원문: tistory — 2022-11-01 발행, 이 블로그로 이전됨.

댓글

댓글을 삭제할까요?

도커에 대한 기본 사용 설명 · 나봄하랑