모든 로그들은 zookeeper 와 kafka 의 docker-compose 시 로그이기도 하며 도커의 시스템 로그도 포함하였습니다.
로그를 확인하는 방법은 아래와 같습니다.
# 가이드
$ docker-compose logs {컨테이너명}
$ systemctl status docker
#가이드 예시
$ docker-compose logs kafka
$ docker-compose logs zookeeper
Log 1
[warning][os,thread] Failed to start thread "GC Thread#0" - pthread_create failed (EPERM) for attributes: stacksize: 1024k, guardsize: 4k, detached.
CentOS7 에서 최신 버전의 도커를 설치 후 문제가 발생하였습니다.
외국 레퍼런스들을 찾아봤을 때 OS와 도커가 호환이 되지 않아 발생하는 경우가 조금씩 보였습니다.
이로 인해서 도커 버전을 낮춰서 재 설치하시거나 다운 그레이드 하셔야 합니다.
Solution
Docker Engine Version을 변경해서 해결하였습니다.
버전을 교체하는 방법은 모든 도커를 깔끔하게 삭제하고 다시 설치하는 방법을 선택하였습니다.
- 기존 버전: 26.1.2-1.el7
- 교체 버전: 18.03.1-ce, build 9ee9f40
- 사용 중인 버전 확인
# yum 으로 설치한 모든 서비스들을 확인합니다.
$ yum list docker-ce --showduplicates | sort -r
사용 중인 컨테이너 모두 종료
# docker ps -a 로 검색한 모든 컨테이너를 종료합니다.
$ docker stop $(docker ps -a -q)
도커 서비스 중지
# docker 서비스 중지
$ docker-service stop
# 도커 소켓 서비스로 인해 종료되지 않을 때 아래와 같이 종료합니다.
$ systemctl stop docker.socket
관련 패키지 삭제
$ yum list installed | grep docker
containerd.io.x86_64 1.4.3-3.1.el7 @docker-ce-stable
docker-ce.x86_64 3:18.09.3-3.el7 @docker-ce-stable
docker-ce-cli.x86_64 1:18.09.3-3.el7 @docker-ce-stable
# 패키지 모두 삭제
$ yum remove containerd.io.x86_64
$ yum remove docker-ce.x86_64
$ yum remove docker-ce-cli.x86_64
# 과거 docker, docker-engine 등 docker로 시작되는 패키지가 설치 되어 있는 경우 함께 삭제
$ yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
도커 컨테이너 및 이미지 삭제
yum으로 도커를 제거하는 경우에는 이미지, 컨테이너, 볼륨, 네트워크는 보존된다고 한다.
# 이미지, 컨테이너, 볼륨 등 도커 모든 관련 파일 삭제 됩니다. 원치 않을 경우 하지 않아도 됩니다.
$ rm -rf /var/lib/docker
도커 필수 패키지 yum-utils 설치 및 저장소 추가
여기서부터는 이제 재 설치 단계입니다.
# 유틸 설치
$ yum install -y yum-utils
# 리포지토리 저장소 추가
$ yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
도커 최신 버전 설치
도커 최신 버전이 아닌 특정 버전으로 설치 할 경우 다음으로 PASS
# 리포지토리에 있는 최신 버전을 확인하여 설치합니다.
$ yum install docker-ce \
docker-ce-cli \
containerd.io
특정 버전 설치
# 설치 가능 버전 확인
$ yum list docker-ce --showduplicates | sort -r
(생략)
docker-ce.x86_64 3:26.1.2-1.el7 docker-ce-stable
docker-ce.x86_64 3:26.1.1-1.el7 docker-ce-stable
docker-ce.x86_64 3:26.1.0-1.el7 docker-ce-stable
(생략)
docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.03.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 18.03.0.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.12.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.12.0.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.09.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.09.0.ce-1.el7.centos docker-ce-stable
(생략)
# 특정 버전 명시 가이드
$ yum install docker-ce-<VERSION_STRING> \
docker-ce-cli-<VERSION_STRING> \
containerd.io
# 특정 버전 명시 예시
$ yum install docker-ce-18.09.3 \
docker-ce-cli-18.09.3 \
containerd.io
yum을 통한 자동 업데이트 중지
yum의 저장소가 연결되어 있는 경우 업데이트가 자동으로 이뤄지는 것을 확인하였습니다.
자동 업데이트로 인해 정상적으로 컨테이너에서 운영중인 서비스가 안되는 경우가 발생하는데 버전이 자동 업데이트 때문입니다.yum.log
와 docker -v
를 이용해 도커 버전을 조회를 통해 알 수 있었다.
# yum으로 설치한 도커 버전 자동 업데이트 비활성화
$ vi /etc/yum.repos.d/docker-ce.repo
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://download.docker.com/linux/centos/$releasever/$basearch/stable
enabled=0 # 이 부분을 1에서 0으로 변경하시면 됩니다.
gpgcheck=1
gpgkey=https
도커 시작 하기
# 도커 서비스 시작
$ service docker start
# 도커 서비스 상태 및 로그 확인
$ systemctl status docker
* docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
Active: active (running) since 목 2024-05-16 15:44:13 KST; 2h 6min ago
Docs: https://docs.docker.com
Main PID: 113565 (dockerd)
Memory: 773.8M
CGroup: /system.slice/docker.service
|-113565 /usr/bin/dockerd
|-113579 docker-containerd --config /var/run/docker/containerd/containerd.toml
|-114597 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 22181 -container-ip 172.18.0.2 -container-port 2181
|-114606 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/aaedf7eb26a79dab98a5c473209b715efc598842cecfd1518768a5a675424543 -address /var/run...
|-114753 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 29092 -container-ip 172.18.0.3 -container-port 9092
`-114760 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/59f05dfb544650e091a5a0c618a3e01102d988aea50e1c7060ea4e1cea4a60fe -address /var/run...
5월 16 15:44:13 test3 dockerd[113565]: time="2024-05-16T15:44:13.232030287+09:00" level=info msg="Loading containers: start."
5월 16 15:44:13 test3 dockerd[113565]: time="2024-05-16T15:44:13.319413354+09:00" level=info msg="Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon option --bip can be used to...rred IP address"
5월 16 15:44:13 test3 dockerd[113565]: time="2024-05-16T15:44:13.356600815+09:00" level=info msg="Loading containers: done."
5월 16 15:44:13 test3 dockerd[113565]: time="2024-05-16T15:44:13.359840320+09:00" level=warning msg="Not using native diff for overlay2, this may cause degraded performance for building images: opaque fl...or later to fix"
5월 16 15:44:13 test3 dockerd[113565]: time="2024-05-16T15:44:13.368149955+09:00" level=info msg="Docker daemon" commit=9ee9f40 graphdriver(s)=overlay2 version=18.03.1-ce
5월 16 15:44:13 test3 dockerd[113565]: time="2024-05-16T15:44:13.368282978+09:00" level=info msg="Daemon has completed initialization"
5월 16 15:44:13 test3 dockerd[113565]: time="2024-05-16T15:44:13.379143860+09:00" level=info msg="API listen on /var/run/docker.sock"
5월 16 15:44:13 test3 systemd[1]: Started Docker Application Container Engine.
5월 16 15:45:35 test3 dockerd[113565]: time="2024-05-16T15:45:35+09:00" level=info msg="shim docker-containerd-shim started" address="/containerd-shim/moby/aaedf7eb26a79dab98a5c473209b715efc598842cecfd15...asks" pid=114606
5월 16 15:45:35 test3 dockerd[113565]: time="2024-05-16T15:45:35+09:00" level=info msg="shim docker-containerd-shim started" address="/containerd-shim/moby/59f05dfb544650e091a5a0c618a3e01102d988aea50e1c7...asks" pid=114760
Hint: Some lines were ellipsized, use -l to show in full.
root외 사용자가 docker 컨테이너 실행 권한 부여
이 작업은 초기에 도커를 설치할 때 했다면 하지 않아도 된다.
# 도커 실행 권한 부여
$ usermod -aG docker <your-user>
# 도커 실행 권한 부여 예시 (계정명:docker)
$ usermod -aG docker docker
docker.io docker.ce 차이
- docker.io 패키지는 Debian/Ubuntu 저장소에서 제공되는 docker 릴리스 용도
- docker.ce 는 docker.com에서 제공하는 직접 제공하는 인증 릴리스, 두 버전은 유사하지만 내부 구조가 매우 다름
- docker.io는 데비안(또는 우분투) 방식으로 수행, 각 외부 종속성은 독립적으로 업데이트될 수 있다. 각 개별 패키지로 구성
- docker-ce는 Golang 방식으로 수행. 모든 종속성은 빌드 전에 소스 트리로 가져오고 이후에는 전체가 하나의 단일 패키지로 형성, 따라서 항상 모든 종속성으로 docker를 업데이트해야 함
참고문서: https://nakanara.tistory.com/229
[[Docker] 도커 삭제 및 재설치
도커를 삭제하거나, 도커의 버전 변경이나, 특정 버전을 설치로 삭제해야 하는 경우 도커 삭제하기 실행 중인 Docker container 중지 docker service, container service 중지 도커 서비스 중지 $ sudo systemctl stop
nakanara.tistory.com](https://nakanara.tistory.com/229)
Log 2
Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error mounting "/var/lib/docker/containers/cc31099f277385ec56a59071813c1dfb2f776f3425a420b7d64ff8ef999233ca/resolv.conf" to rootfs at "/etc/resolv.conf": possibly malicious path detected -- refusing to operate on /etc/resolv.conf: unknown
Solution
이 에러는 컨테이너가 생성되면서 로컬 서버의 DNS설정파일을 참조하는데 권한 관련하여 문제가 있어보였습니다.
OS와 도커가 호환되지 않아 발생하는 것으로 보여집니다.
이로 인해서 도커 버전을 낮춰서 재 설치 하시거나 다운드레이드 후 해결되었습니다.
Log 3
zookeeper 06:46:39.64 ERROR ==> The ZOO_ENABLE_AUTH environment variable does not configure authentication. Set the environment variable ALLOW_ANONYMOUS_LOGIN=yes to allow unauthenticated users to connect to ZooKeeper.
Solution
docker-compose.yml 설정에서 ALLOW_ANONYMOUS_LOGIN=yes 설정을 넣어주면 됩니다.
하지만 보통은 이 설정을 추가하지 않아도 됩니다.
이 에러는 다른 문제일 수 있다고 생각합니다.
이때 설정을 추가하지 않고 컨테이너를 올렸을 때 문제 없이 정상적으로 작동하였습니다. 필수 조건이 아니라는 얘기입니다.
services:
zookeeper:
image: zookeeper:3.4.10
environment:
- ZOOKEEPER_SERVER_ID=1
- ZOOKEEPER_CLIENT_PORT=2181
- ZOOKEEPER_TICK_TIME=2000
- ZOOKEEPER_INIT_LIMIT=5
- ZOOKEEPER_SYNC_LIMIT=2
ports:
- "22181:2181"
environment:
# ALLOW_PLAINTEXT_LISTENER 추가
- ALLOW_ANONYMOUS_LOGIN=yes
kafka:
image: docker.io/bitnami/kafka:2.5.0
depends_on:
- zookeeper
ports:
- "29092:9092"
environment:
- ALLOW_PLAINTEXT_LISTENER=yes
- KAFKA_BROKER_ID=1
- KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
- KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092,PLAINTEXT_HOST://0.0.0.0:29092
- KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://10.100.11.107:29092
- KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
- KAFKA_INTER_BROKER_LISTENER_NAME=PLAINTEXT
- KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1
- KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS=0
Log 4
ERROR Exiting Kafka due to fatal exception (kafka.Kafka$) kafka-1 | java.lang.IllegalArgumentException: requirement failed: advertised.listeners listener names must be equal to or a subset of the ones defined in listeners. Found PLAINTEXT,PLAINTEXT_HOST. The valid options based on the current configuration are PLAINTEXT
Solution
이 에러는 docker-compose.yml 설정에서 정상적으로 설정이 되어있지 않았을 때 발생하거나 네트워크 대역이 서로 달라 발생하는 경우입니다. 나는 이때 카프카 리스너 설정을 변경하여 조치가 되었었습니다.
특정 버전 이상부터 localhost를 사용하지 않도록 패치 되었다고 합니다.
# 브로커가 요청을 수신할 네트워크 인터페이스와 포트를 정의합니다. 'PLAINTEXT'는 이 전송을 평문으로 수신한다는걸 의미합니다.
- KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092,PLAINTEXT_HOST://0.0.0.0:29092
# 클라이언트가 카프카 브로커에 연결할 때 주소를 정의합니다. 클라이언트가 브로커에 접근할 수 있도록 설정하는 것과 같습니다.
# 10.100.11.107:29092로 접근하겠다는 의미입니다.
- KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://10.100.11.107:29092
# 리스너이름과 프로토콜의 매핑을 정의합니다. `PLAINTEXT`리스너는 PLAINTEXT프로토콜을 사용하고 `PLIANTEXT_HOST` 리스너는 `PLIANTEXT_HOST`프로토콜을 사용합니다.
- KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
Log 5
zookeeper-1 | Error executing 'postInstallation': EINVAL: invalid argument, rename '/opt/bitnami/zookeeper/conf/configuration.xsl' -> '/bitnami/zookeeper/conf/configuration.xsl’
Solution
주키퍼의 구성 파일이 정상적으로 되어있지 않은 경우 나오는데 이는 특정 이미지에서만 발생하는 것 같아 보였습니다.
zookeeper 버전을 교체하고나서 해결하였습니다.
Log 6
dockerd[19248]: time="2024-05-13T17:50:16.201084986+09:00" level=warning msg="WARNING: bridge-nf-call-iptables is disabled
Solution
call-iptables is disabled 는 옵션이 비활성화되어있다는 내용입니다.
bridge 네트워크를 통해 송수신되는 패킷이 호스트의 iptables 설정을 우회 한다는 의미입니다.
보통은 이 설정을 활성화하는 것이 보안에 좋습니다.
$ vi /etc/sysctl.conf
...다음 내용 추가...
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
$ sysctl -p 또는 systemctl restart network
Log 7
갑자기 SSH 연결이 끊어지거나 연결이 되지 않는 경우 네트워크 인터페이스를 잘못 만들어서 컨테이너를 올리는 동시에 끊어지는 경우입니다. 이 네트워크 브릿지를 제외하고 모두 삭제합니다.
Solution
컨테이너가 올라가는 동시에 SSH가 끊어지게 됩니다.
보통은 이런 증상이 없지만 IDC와 본사가 IPSEC으로 연결되어있을 때 이러한 증상이 발견됩니다.
하지만 내부 네트워크의 다른 서버에서는 접근이 가능하기 때문에 동일 네트워크의 다른 서버에서 SSH연결하여 삭제합니다.
# 등록된 docker network 확인
# 1번 3번 4번만 있고 2번은 나중에 생성됩니다.
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
adb825357d32 bridge bridge local
c4704fb03b82 docker-compose_default bridge local
3eccfdf22f92 host host local
9d0bfef57939 none null local
# 서버에 등록된 네트워크 인터페이스 확인
$ ifconfig
# 잘못등록된 network는 broadcast가 0.0.0.0으로 되어있습니다.
# 보통은 아래 docker0만 그렇게 잡혀있지만 잘못등록했다면 다른 하나가 더있을 것입니다.
br-08bfd7592e28: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.19.0.1 netmask 255.255.0.0 broadcast 172.19.255.255
ether 02:42:52:2c:32:24 txqueuelen 0 (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
br-c4704fb03b82: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.18.0.1 netmask 255.255.0.0 broadcast 172.18.255.255
ether 02:42:1c:30:cf:f0 txqueuelen 0 (Ethernet)
RX packets 11256 bytes 858616 (838.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 22213 bytes 1361119 (1.2 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
ether 02:42:0c:0f:c9:ac txqueuelen 0 (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
Log 8
Redirecting to /bin/systemctl stop docker.service Warning: Stopping docker.service, but it can still be activated by: docker.socket
Solution
docker.socket을 사용하고 있어 종료를 할수 없다고 나옵니다. 도커를 종료했지만 소켓 서비스가 살아있기 때문에 종료해주어야 합니다.
$ systemctl docker.socket stop
Log 9
아무 로그도 나오지 않고 컨테이너가 올라가지 않는 경우입니다.
Solution
docker-compose 로 dockerhub에서 가져온 이미지마다 설정하는 부분이 조금씩 달라보였습니다.
그래서 이 설정 값이 문제가 생겨 이미지를 올린 곳의 doc에 들어가서 확인하고 필수로 설정해야 하는 것들이 무엇이 있는지 확인해보셔야 합니다.
Log 10
Error response from daemon: pull access denied for wurstmeister/kafka, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
Solution
이 에러는 dockerhub에 로그인하라는 의미입니다. 원래라면 로그인하지 않아도 되지만 자신의 계정에서만 엑세스 가능한 이미지라면 로그인을 해야 합니다. 또한 로그인 후 자신이 찾는 이미지가 있는지 확인도 가능합니다.
# docker 로그인
$ docker login
# dockerhub 에서 해당 이미지가 존재하는지 확인
$ docker search wurstmeister/kafka
Log 11
ifconfig에 불필요한 인터페이스를 지웠는데 ifconfig에 계속 남아있는 증상입니다.
docker0이라는 인터페이스의 CIDR설정이 중요한 이유는 해당 HOST에 올라가는 모든 컨테이너의 IP영역을 결정짓습니다. 또한 컨테이너를 생성하면 인터페이스가 생성됩니다. 그래서 ifconfig 에서 확인했을 때 여러 인터페이스가 보여집니다.
혹시나 인터페이스 대역을 변경해야 할 경우도 있어서 변경하는 방법도 기재합니다.
Solution
불필요한 인터페이스 삭제
# 도커 서비스 중지
$ service docker stop
# 도커 서비스 상태 확인
$ service docker status
$ ip link
br-c4704fb03b82: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.18.0.1 netmask 255.255.0.0 broadcast 172.18.255.255
ether 02:42:1c:30:cf:f0 txqueuelen 0 (Ethernet)
RX packets 11680 bytes 889992 (869.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 23061 bytes 1411999 (1.3 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
$ ip link set dev br-c4704fb03b82 down
docker0 인터페이스 설정 변경
# 도커 서비스 중지
$ service docker stop
# 도커 서비스 상태 확인
$ service docker status
# 네트워크 인터페이스 확인
$ ip addr
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
ether 02:42:0c:0f:c9:ac txqueuelen 0 (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
# 인터페이스 삭제
$ ip addr del 172.17.0.1/16 dev docker0
# 인터페이스 재 생성
$ ip addr add 192.168.1.1/24 dev docker0
# 인터페이스 실행
$ ip link set dev docker0 up
Log 12
Error: Package: docker-ce-rootless-extras-20.10.12-3.el7.x86_64 (docker-ce-stable) Requires: slirp4netns >= 0.4 Error: Package: 3:docker-ce-20.10.12-3.el7.x86_64 (docker-ce-stable) Requires: container-selinux >= 2:2.74 Error: Package: containerd.io-1.4.12-3.1.el7.x86_64 (docker-ce-stable) Requires: container-selinux >= 2:2.74 Error: Package: docker-ce-rootless-extras-20.10.12-3.el7.x86_64 (docker-ce-stable) Requires: fuse-overlayfs >= 0.7
Solution
이 문제는 의존성 패키지 문제입니다. 원래라면 다 설치를 해주는데 없는 것들도 있어서 그런 것 같아 보였습니다.
[방법1]
- http://mirror.centos.org/centos/7/extras/x86_64/Packages/ 접속하여 자신이 없는 패키지 우 클릭 후 주소 복사
# 예시
$ yum install -y {파일 주소}
# 필요한 의존성 패키지 다운로드 및 설치
$ yum install -y <http://mirror.centos.org/centos/7/extras/x86_64/Packages/slirp4netns-0.4.3-4.el7_8.x86_64.rpm>
[방법2]
yum -y install docker docker-registry
'Docker' 카테고리의 다른 글
Docker 명령어 (0) | 2024.06.05 |
---|---|
CentOS 7에서 Docker Compose를 이용한 Kafka 및 Zookeeper 설치 가이드 (0) | 2024.05.20 |