우분투에 Docker 설치하기

Ubuntu Bionic 18.04 (LTS) 에 도커 설치하기

사전 확인

이전 버전 삭제하기

만약 이전 버전의 도커가 설치되어 있다면 먼저 삭제해야합니다. 패키지명은 docker, docker.io 또는 docker-engine 입니다

sudo apt-get remove docker docker-engine docker.io containerd runc

도커 설치하기

리포지토리를 이용하여 설치하기

새로운 호스트 시스템에, 처음으로 도커 엔진을 설치하기 위해서는, 도커 리포지토리를 설정해야 합니다. 설정 후후 리포지토리를 이용하여 도커를 설치하고 업데이트할 수 있습니다.

리포지토리 설정하기

https를 통해 리포지토리를 사용할 수 있도록, 적절한 패키지 인덱스 및 설치 패키지 업데이트 합니다.

sudo apt-get update

sudo apt-get install \\
    apt-transport-https \\
    ca-certificates \\
    curl \\
    gnupg-agent \\
    software-properties-common

도커의 공식 GPG key를 추가합니다

curl -fsSL <https://download.docker.com/linux/ubuntu/gpg> | sudo apt-key add -

도커를 설치하기 위한 리포지토리를 추가합니다.

sudo add-apt-repository \\
   "deb [arch=amd64] <https://download.docker.com/linux/ubuntu> \\
   $(lsb_release -cs) \\
   stable"

도커 설치하기

apt 패키지 인덱스를 업데이트하고, 도커 엔진과, containerd 를 설치합니다.

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli 

도커 확인하기

docker 를 일반 사용자 계정에서 사용하려면, docker 그룹에 사용자 계정을 추가해 줘야합니다.

sudo usermod -aG docker <your-username>

로그 아웃을 한 다음, 다시 접속을 해야 설정이 적용됩니다.

docker info 명령어를 실행하여, 설치된 도커의 정보를 확인할 수 있습니다.

docker info

정상적으로 실행되면, 다음과 같은 결과를 확인할 수 있습니다.

Client:
 Debug Mode: false

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 19.03.12
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Native Overlay Diff: true
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc version: dc9208a3303feef5b3839f4323d9beb36df0a9dd
 init version: fec3683
 Security Options:
  apparmor
  seccomp
   Profile: default
 Kernel Version: 4.15.0-76-generic
 Operating System: Ubuntu 18.04.4 LTS
 OSType: linux
 Architecture: x86_64
 CPUs: 1
 Total Memory: 3.852GiB
 Name: magi
 ID: 53WF:R22P:ZLLX:5564:H5MV:2WDA:S7UK:CK5Y:G647:TH6W:D74Z:UPDZ
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: <https://index.docker.io/v1/>
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

WARNING: No swap limit support

우분투 18.04에 네트워크 카드 추가하기

우분투 18.04 부터는 네트워크 카드를 설정하려면, netplan을 사용해야 합니다.

네트워크 인터페이스 추가

네트워크 인터페이스를 추가한 다음, ifconfig 명령어를 실행해 봅니다. 별다른 옵션을 주기 않았기 때문에, 추가된 네트워크 인터페이스가 보이지 않습니다.

ifconfig
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 944  bytes 67408 (67.4 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 944  bytes 67408 (67.4 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

추가한 네트워크 인터페이스 확인

ifconfig -a 명령어를 이용하여, 추가한 네트워크 인터페이스를 확인할 수 있습니다.

ifconfig -a

eth0 이 추가된 것을 확인할 수 있습니다.

eth0: flags=4098<BROADCAST,MULTICAST>  mtu 1500
        ether 00:15:5d:15:0e:00  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 944  bytes 67408 (67.4 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 944  bytes 67408 (67.4 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

설정에 네트워크 인터페이스를 추가하기

/etc/netplan/*.yaml 파일에 네트워크 설정을 추가해 줘야 합니다

cat /etc/netplan/*.yaml
# This file is generated from information provided by the datasource.  Changes
# to it will not persist across an instance reboot.  To disable cloud-init's
# network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
    ethernets: {}
    version: 2

현재 설정된 네트워크 인터페이스가 없기 때문에, ethernets 필드에 아무런 값이 없습니다.

/etc/netplan/*.yaml 파일에 네트워크 설정을 추가합니다.

sudo vi /etc/netplan/*.yaml

ifconfig -a 명령어를 통해서 확인한 네트워크 인터페이스 이름을 ethernets 필드에 추가하고, 설정값을 지정해줍니다. 아래 예제에서는 dhcp 를 사용하기 때문에, IP 직접 명시하지 않았습니다.

# This file is generated from information provided by the datasource.  Changes
# to it will not persist across an instance reboot.  To disable cloud-init's
# network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
    ethernets:
        eth0:
            addresses: []
            dhcp4: true
    version: 2

만약 고정 IP를 사용한다면 아래처럼 설정할 수 있습니다.

# This file is generated from information provided by the datasource.  Changes
# to it will not persist across an instance reboot.  To disable cloud-init's
# network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
    ethernets:
        eth0:
            addresses: [192.168.21.100/24]
            gateway4: 192.168.56.1
            nameservers:
                    addresses: [8.8.8.8,8.8.4.4]
            dhcp4: no
            dhcp6: no
    version: 2

설정 적용하기

다음 명령어를 실행하여, 변경한 설정을 적용합니다.

sudo netplan apply

설정이 적용되면 ifconfig 명령어를 실행하여, 적용한 내용을 확인할 수 있습니다.

ifconfig

정상적으로 적용되었다면, 추가한 eth0 을 확인할 수 있습니다.

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.21.39  netmask 255.255.255.0  broadcast 192.168.21.255
        inet6 fe80::215:5dff:fe15:e00  prefixlen 64  scopeid 0x20<link>
        ether 00:15:5d:15:0e:00  txqueuelen 1000  (Ethernet)
        RX packets 47668  bytes 70216376 (70.2 MB)
        RX errors 0  dropped 6  overruns 0  frame 0
        TX packets 9362  bytes 772780 (772.7 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 120  bytes 9592 (9.5 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 120  bytes 9592 (9.5 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Linux buffer/cache 비우기

리눅스(linux)에서 top이나 free 명령어로 메모리 상태를 확인할 수 있다. 버퍼와 캐시는 자주 사용하는 파일등의 정보를 저장하여 성능을 빠르게 유지할 수 있는 장점이 있지만, 너무 많아지면 가용 메모리의 부족으로 다른 문제를 야기시킬 수 있다. 그래서 버퍼/캐시의 사용량이 너무 높을 경우 해당 기능을 끄거나, 주기적으로 비움으로 성능을 개선할 수 있다.

아래 명령어로 캐시를 비울 수 있다. sync를 사용하는 이유는 캐시 메모리에 올라간 데이터를 디스크로 옮겨준다. 이 과정을 거치치 않고 캐시를 삭제하면, 데이터가 유실될 수도 있다.

pagecache 비우기

sync
echo 1 > /proc/sys/vm/drop_caches
또는
sync
sysctl -w vm.drop_caches=1

dentries, inodes 비우기

sync
echo 2 > /proc/sys/vm/drop_caches
또는
sync
sysctl -w vm.drop_caches=2

pagecache, dentries, inodes 모두 비우기

sync
echo 3 > /proc/sys/vm/drop_caches
또는
sync
sysctl -w vm.drop_caches=3

주기적으로 캐시 비우기

주기적으로 캐시를 삭제하고 싶으면, crontab -e 명령어를 사용하면 된다.

0 3 * * 0 sync && echo 3 > /proc/sys/vm/drop_caches # 매일 오전 3시에 캐시 비우기

yum 특정 버전으로 설치 또는 업데이트 하기

기본 명령어

# yum [options] COMMAND

# yum list [package name] --showduplicates
# yum install [package name]-[version]
# yum update [package name]-[version]

예제

# yum list kubelet --showduplicates
# yum install kubelet-1.11.3-0
# yum update kubelet-1.11.3-0

주요 명령어 옵션

–enablerepo=[repo] : 여러개의 저장소가 있을 경우, 사용할 저장소를 지정한다.

–disablerepo=[repo] : 사용하지 않을 저장소를 지정한다.

–nogpgcheck : GPG 서명 검증을 사용하지 않는다.

-d [debug level] : 디버깅 레벨을 지정한다. 0-10까지 가능하며, 숫자가 클수록 상세한 정보를 출력한다.

-y, –assumeyes : yum 실행 중에 나오는 질문들을 모두 yes로 처리한다.

systemd

주요 명령어

systemd를 위한 주요 명령어는 다음과 같습니다.

  • systemctl
  • systemctl-analyze
  • systemctl-cgls
  • systemd-cgtop
  • systemd-loginctl

systemctl

전체 서비스 목록을 출력해 줍니다.

$ systemctl
...
  ipmi.service                                                                                      loaded active exited    IPMI Driver
  ipmievd.service                                                                                   loaded failed failed    Ipmievd Daemon
  irqbalance.service                                                                                loaded active running   irqbalance daemon
  kmod-static-nodes.service                                                                         loaded active exited    Create list of required static device nodes for the current kernel
  kubelet.service                                                                                   loaded active running   kubelet: The Kubernetes Node Agent
  lvm2-lvmetad.service                                                                              loaded active running   LVM2 metadata daemon
  lvm2-monitor.service                                                                              loaded active exited    Monitoring of LVM2 mirrors, snapshots etc. using dmeventd or progress polling
  network.service                                                                                   loaded failed failed    LSB: Bring up/down networking
  noms_nsight.service                                                                               loaded active exited    SYSV: noms_nsight
  noms_nsight_jp.service                                                                            loaded active exited    SYSV: noms_nsight
  nscd.service                                                                                      loaded active running   Name Service Cache Daemon
  ntpdate.service                                                                                   loaded active exited    Set time via NTP
  prov2-line-agent.service                                                                          loaded active running   PROV2 agent
  rhel-dmesg.service                                                                                loaded active exited    Dump dmesg to /var/log/dmesg
  rhel-domainname.service                                                                           loaded active exited    Read and set NIS domainname from /etc/sysconfig/network
  rhel-import-state.service                                                                         loaded active exited    Import network configuration from initramfs
  rhel-readonly.service                                                                             loaded active exited    Configure read-only root support
  ...

변경된 서비스 설정 정보를 데몬에 반영하기

$ systemctl daemon-reload

서비스를 활성화 하기

$ systemctl enable [서비스명]

서비스를 비활성화 하기

$ systemctl disable [서비스명]

서비스 활성화 여부 확인하기

$ systemctl is-enabled [서비스명]
enabled

서비스 시작하기

 systemctl start [서비스명]

서비스 종료하기

$ systemctl stop [서비스명]

서비스 재시작하기

$ systemctl restart [서비스명]

서비스 갱신하기

$ systemctl reload [서비스명]

서비스 동작 여부 확인하기

$ systemctl is-active [서비스명]
active

서비스 상태 출력 하기

$ systemctl status -l [서비스명]
kubelet.service - kubelet: The Kubernetes Node Agent
 Loaded: loaded (/etc/systemd/system/kubelet.service; enabled; vendor preset: disabled)
Drop-In: /etc/systemd/system/kubelet.service.d
         └─10-kubeadm.conf
 Active: active (running) since Wed 2018-12-26 20:14:53 JST; 5 months 21 days ago
   Docs: https://kubernetes.io/docs/
 Main PID: 77429 (kubelet)
  Tasks: 24
 Memory: 68.2M
 CGroup: /system.slice/kubelet.service
         └─77429 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet/config.yaml --cgroup-driver=cgroupfs --cni-bin-dir=/opt/cni/bin --cni-conf-dir=/etc/cni/net.d --network-plugin=cni

서비스 이름과 활성화 여부 확인하기

$ systemctl list-unit-files
...
initrd-udevadm-cleanup-db.service             static
ip6tables.service                             disabled
ipmi.service                                  enabled
ipmievd.service                               enabled
iprdump.service                               disabled
iprinit.service                               disabled
iprupdate.service                             disabled
ipsec.service                                 disabled
iptables.service                              enabled
irqbalance.service                            enabled
kdump.service                                 masked
kmod-static-nodes.service                     static
kpatch.service                                disabled
kubelet.service                               enabled
libstoragemgmt.service                        masked
lm_sensors.service                            masked
...

부팅시 실패한 서비스 목록 출력하기

$ systemctl --failed
  UNIT                           LOAD   ACTIVE SUB    DESCRIPTION
  ipmievd.service                loaded failed failed Ipmievd Daemon
  network.service                loaded failed failed LSB: Bring up/down networking
  systemd-tmpfiles-clean.service loaded failed failed Cleanup of Temporary Directories
  systemd-tmpfiles-setup.service loaded failed failed Create Volatile Files and Directories

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

4 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.

systemd-analyze

systemd-analyze 명령어는 분석 정보를 출력해 줍니다.

$ systemd-analyze
Startup finished in 862ms (kernel) + 868ms (initrd) + 1min 4.908s (userspace) = 1min 6.639s
$ systemd-analyze blame
         50.457s unbound-anchor.service
         30.003s iaas-pm-bootup.service
          7.705s cloud-final.service
          7.102s cloud-init.service
          3.270s ntpdate.service
          2.743s network.service
          1.252s docker.service
           640ms cloud-init-local.service
           369ms cloud-config.service
           345ms lvm2-monitor.service
           313ms systemd-udev-settle.service
           251ms dev-vda2.device
           183ms prov2-line-agent.service
           141ms snmpd.service
           124ms sshd-keygen.service
           111ms hostagent_kr.service
           111ms hostagent_jp_line.service
            90ms systemd-vconsole-setup.service
            51ms rc-local.service
...

critical-chain을 이용하면, 시간을 많이 소요한 서비스의 실행과 대기에 대해서 체인 형태로 출력할 수 있습니다.

$ systemd-analyze critical-chain
The time after the unit is active or started is printed after the "@" character.
The time the unit takes to start is printed after the "+" character.

multi-user.target @34.062s
└─iaas-pm-bootup.service @4.056s +30.003s
  └─basic.target @623ms
    └─sockets.target @623ms
      └─dbus.socket @623ms
        └─sysinit.target @622ms
          └─systemd-update-utmp.service @617ms +5ms
            └─systemd-remount-fs.service @183ms +13ms
              └─systemd-fsck-root.service @584542y 2w 2d 20h 1min 49.069s +11ms
                └─systemd-journald.socket
                  └─-.slice

systemd-cgls

systemd-cgls 명령어는 현재 cgroup에 대한 정보를 타입별로 출력해줍니다.

$ systemd-cgls
├─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
├─kubepods
│ └─burstable
│   ├─podfc4890ab91dfb8b8a630043af37f52d8
│   │ ├─dc2312d450abd72c1490775e615fbf41abbef49bb4ccdc6a9d9d8bb7ec880724
│   │ │ └─40435 kube-apiserver --apiserver-count=5 --authorization-mode=Node,RBAC --advertise-address=10.xx.xx.xx --allow-privileged=true --client-ca-file=/etc/kubernetes/pki/ca.crt --disable-admission-plugins=Persiste
│   │ └─5b42977c143110757f6d7ae747fbe435f878f8427d30274936eb06bb5dc21b2c
│   │   └─40405 /pause
│   ├─pod734afb7f-08db-11e9-aa26-fa1648a9a65b
│   │ ├─a76db3d9d75d1a48f3231c75b601fd6c7ad1b33ff83e054482b800b2cf6ca049
│   │ │ └─104263 /bin/node_exporter --path.procfs=/host/proc --path.sysfs=/host/sys
│   │ └─e8bffecd18687c7cb1ca90b3de906928e6af50081601203a2bab7f5fea19ae34
│   │   └─104169 /pause
│   ├─pod49e68627-08ce-11e9-837e-fa1648a9a65b
│   │ ├─dd6d53bb4036a64572e4a64f5997a87e5bfb6e5c25f453153854fca88105e54a
│   │ │ └─kube-proxy
│   │ │   └─80946 /usr/local/bin/kube-proxy --config=/var/lib/kube-proxy/config.conf
│   │ └─bc202979fd26611a1ec0ac59fd013d66dff2262da590d326dd3817ed5a56dd28
│   │   └─80907 /pause
│   ├─pod45de6e05-08ce-11e9-837e-fa1648a9a65b
│   │ ├─3881a2163345cf5b6f9c6bca07e2f36394fe6a0ee3a13a33a3f12e9669385a52
│   │ │ └─80804 /opt/bin/flanneld --ip-masq --kube-subnet-mgr --iface=private --iface=bond0 --iface=eth0
│   │ └─a8b41a45c4e3cf278d3841e67914c81382bc4b536f6b86183c3a2eed4f059377
│   │   └─80713 /pause
│   ├─pod705e7ce1217a37349a5567101e60165d
│   │ ├─51d6579bb1d26c0868908077434fe519377b67ba5bd81530bd3d0c3ad1369260
│   │ │ └─82155 kube-scheduler --address=127.0.0.1 --kubeconfig=/etc/kubernetes/scheduler.conf --leader-elect=true
│   │ └─dfc5ef7ff3565013fd50361c2a848010916fe4246dbd6c190df740068648c510
│   │   └─77628 /pause
...

systemd-cgtop

system-cgtop 명령어는 흔히 알고 있는 top 명령어 처럼, cgroup에 대하여 CPU, Memory, I/O에 대한 결과를 출력해 줍니다.

$ $ systemd-cgtop
Path                                                                                         Tasks   %CPU   Memory  Input/s Output/s

/                                                                                               84      -     4.8G        -        -
/kubepods.slice                                                                                  -      -   850.1M        -        -
/kubepods.slice/kubepods-besteffort.slice                                                        -      -   370.7M        -        -
/kubepods.slice/kubepods-best...s-besteffort-pod0b4c1d31_78dc_4d84_b496_6f082c63977b.slice       -      -    14.1M        -        -
/kubepods.slice/kubepods-best...epods-besteffort-pod0eb79a133166edcb3192c85c01bd9b32.slice       -      -   356.6M        -        -
/kubepods.slice/kubepods-burstable.slice                                                         -      -   463.2M        -        -
/kubepods.slice/kubepods-burs...bepods-burstable-pod4c9fe2c16888e009cff100467a01a432.slice       -      -    14.8M        -        -
/kubepods.slice/kubepods-burs...bepods-burstable-pod87880e44c58a3215aba1a2b52b5f211e.slice       -      -    14.1M        -        -
/kubepods.slice/kubepods-burs...bepods-burstable-podbe31476e2cd67aa8bdc87bbf4f55679d.slice       -      -   434.2M        -        -
/kubepods.slice/kubepods-podb3a9dde5_43ee_43db_af71_e0d4cfb0e27c.slice                           -      -    16.1M        -        -
/kubepods.slice/kubepods-podb...9d86c2566ee644a239924a32c90888bb76baa2ab1986ac3e54e7.scope       1      -    16.0M        -        -
/kubepods.slice/kubepods-podb...5a75cafc6ee2540f1110c5aabfc177d03df2291c4229949adc96.scope       1      -    44.0K        -        -
/system.slice                                                                                    -      -     1.3G        -        -

디스크 사용량

df : 디스크 사용량 확인

디스크의 사용량을 보기 좋게 출력해 준다

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda2       100G  6.6G   94G   7% /
devtmpfs         16G     0   16G   0% /dev
tmpfs            16G   12K   16G   1% /dev/shm
tmpfs            16G 1004K   16G   1% /run
tmpfs            16G     0   16G   0% /sys/fs/cgroup
/dev/vdc1       3.0T  528G  2.5T  18% /mnt
tmpfs           3.2G     0  3.2G   0% /run/user/0
tmpfs           3.2G     0  3.2G   0% /run/user/10000
...

현재 디렉토리를 포함하는 파티션의 용량을 출력해 준다.

$ df -h .
Filesystem      Size  Used Avail Use% Mounted on
/dev/vdc1       3.0T  528G  2.5T  18% /mnt

du: 디렉토리 및 파일 용량 확인

현재 디렉토리에 있는, 디렉토리 및 파일 용량을 보기 좋게 출력해 준다.

$ du -sh *
41G     01DAR7DQAV4TX9XMQA53H8P2KN
38G     01DCJ573XV9BS33MW7728Y4YR1
38G     01DCQYKT2QCZHF9J00H2W2GV62
38G     01DCXR075DH20RB24RAY92M129
1.6G    01DCZN81WMAWP6RCD79XKV8T0J
13G     01DCZNJW2WSNXC6GYNFY1AEH9M
1.7G    01DCZW3S4K9BM13KS623FDTZ26
0       lock
31G     wal

현재 디렉토리에 있는, 디렉토리 및 파일 중에서 용량이 큰 순서대로 10개를 출력해 준다.

$ du -sh * | sort -rh | head -n 10