본문 바로가기
DevOps/Kubernetes & Docker

[Docker] Ubuntu:20.04 컨테이너 Django 환경 구축

by Hwan,. 2022. 3. 31.
728x90
반응형

글 목적

아래 내용은 docker 설치와 이미지를 run한 이후 내부 컨테이너에서 apt-get update하는 부분부터 에러가 발생하여 해결하기 위해 삽질한 과정이다.

환경을 설치하고 Django web 페이지를 띄울 때까지 오류 상황들을 순서대로 적은 글이고 중간에 돌아가는 과정이 있기 때문에 빠른 결론을 원하면 아래 apt-get update 성공 부분부터 읽으면 될 듯 하다.

만약 이 글과 비슷한 상황이라면 순서대로 읽는 것 보단 필요한 부분만 찾아서 시도해보길 바란다. 

 

도커 이미지는 아래 명령어로 run하였고, 컨테이너 이름은 test이다.

$ sudo docker run -it --name=test ubuntu:20.04 /bin/bash

 

docker 설치나 사용에 관한 내용은 아래 링크 참조.

https://hwan001.tistory.com/180

 

[Docker] Ubuntu에 Docker 설치하기

Docker ? 리눅스 컨테이너화 기술로 사용자가 리눅스 컨테이너를 만들고 사용할 수 있도록 지원한다. 도커는 가상화 기술이 아닌 격리 기술이지만 가상 머신과 비슷한 느낌으로 사용한다. 컨테이

hwan001.co.kr


 

apt-get update 에러

 Ubuntu:20.04 컨테이너를 실행하고 가장 먼저 apt-get update 명령어를 사용했지만, Err 메시지가 뜨면서 모든 저장소에 연결되지 않았다. 또한 ip, vi, ping, route 등의 기본 명령어들도 제공되지 않아 원인 파악도 제한된다.

검색해보니 docker의 보안으로 인해 최초에 해당 기능들이 제공되지 않기 때문에 만약 필요하면 apt-get install로 각각을 설치해서 사용하라고 하는데, 문제는 apt-get 저장소 연결 자체가 안되는 상황이다. 

 

원인을 검색해봤더니 DNS 연결 문제로 저장소 URL을 찾을 수 없어 발생하는 에러기 때문에 해당 주소를 잘 변경해주면 연결이 된다고 한다. DNS 주소를 수정하는 방법은 아래 링크를 참고했다.

https://askubuntu.com/questions/1167080/unable-to-update-ubuntu-docker-container-using-apt-get-update

 

unable to update ubuntu Docker container using apt-get update

when I run ubuntu as Docker container and when I run apt-get update command it gives error and fails to update the repos. Here is what error I'm getting : root@df167e514b29:/# sudo bash: sudo: c...

askubuntu.com

검색을 통해 /etc/resolv.conf 등 필요한 파일들을 수정해줬고, DNS (8.8.8.8) 주소도 잘 설정되어 있다.

하지만 여전히 update가 안되었기 때문에 결국 필요한 패키지들을 수동으로 설치하기로 했다.


 

apt-get download

보통 필요한 패키지들은 apt-get install로 시스템에 바로 설치하지만 현재는 원인을 알 수 없는 이유로 저장소 연결이 제한된다. 패키지의 수동 설치를 위해서 먼저 docker 컨테이너를 빠져나가 apt-get이 잘 작동되는 os에서 필요한 패키지들을 다운로드 받는다.

 

$ sudo apt-get download vim net-tools iproute2 iputil-ping

 

apt-get download 명령어는 현재 디렉토리에 .deb 형태로 필요한 패키지를 다운로드 받는다.

aaa라는 임시 폴더를 만들어 내부에 필요한 deb 들을 설치했다.

 

이제 이 파일들을 도커 내부의 ubuntu:20.04로 전달하여 수동으로 설치하면 된다.


 

docker cp

도커는 도커 외부와 내부 컨테이너 간의 파일 공유가 가능하며 docker cp 명령어로 해당 기능을 제공한다.

위에서 내려받은 deb 파일을 ubuntu:20.04 컨테이너에 넣어준다.

$ sudo docker cp ../aaa/ test:/aaa/

잘 전달되었다.

이제 전달된 deb를 설치해주자.


 

apt install ./

apt install 명령어를 사용하면 패키지를 설치할 수 있다.

여기서 주의할 점이 있는데, install 뒤에 패키지 명을 그냥 입력하면 저장소에서 해당 패키지를 찾기 때문에

./을 붙여 현재 디렉토리 내부의 파일이라고 명시해 주어야 한다.

 

하나씩 설치해보겠다.

$ apt install ./net-tools_1.60+git20180626.aebd88e-1ubuntu1_amd64.deb

net-tools

 

$ apt install ./iputils-ping_3%3a20190709-3_amd64.deb

iputils-ping 에러

 

iputil-ping 패키지를 설치하던 중 의존성과 관련된 에러가 발생했다.

libcap2 와 libcap2-bin이 설치되지 않아 발생한 에러이다.

docker 외부에서 다운받은 뒤 같이 설치해주자.

$ apt-get download libcap2 libcap2-bin

 

설치할땐 libcap2-bin의 의존성 때문에 libcap2를 먼저 설치해줘야 한다. 

 

iputils-ping을 설치해보자.

 

드디어 iputils-ping의 설치가 끝났다.

다른 패키지들도 비슷한 방식으로 설치하면 되지만 사실 중요한건 패키지 설치가 아니라 환경 구축이다.

더 이상 설치하지 말고 ping을 사용해서 저장소와 연결 상태를 먼저 확인해보자.


 

Ping

DNS로 먼저 날려봤지만 당연하다는 듯 패킷이 나가지 않는다.

 

게이트 웨이로도 연결이 안된다..

 

여기서 추론 가능한 연결 실패 원인은 크게 2가지인 것 같다.

방화벽에서 패킷이 drop 당하거나, 이중 NAT로 인한 route 문제.

 

방화벽은 없으니 홈 서버를 구성하면서 뭔가 문제가 생긴 듯 하다.


 

docker network

좀 더 찾아보니 도커는 docker network 명령어로 네트워크 생성, 설정 등의 작업을 지원한다.

원래 해당 명령어는 컨테이너들 간의 통신을 가상 네트워크 장비를 통해 지원해주는게 주 역할이지만 내 문제해결에도 큰 도움이 됐다. 

이 글에서 한번에 작성하기엔 범위가 크고 주제도 맞지 않기 때문에 명령어 설명은 생략하겠다.

 

기본적으로 컨테이너를 생성하면 브릿지 형태의 네트워크로 설정된다. 

컨테이너 밖에서 ifconfig 해보면 docker0라는 가상 네트워크 인터페이스가 생긴걸 알 수 있다.

컨테이너 외부의 가상 인터페이스 ip는 D클래스가 1번으로 지정되어 있고, 내부에서 ifconfig 설치 후 확인해보면

172.17.0.2를 갖는걸 볼 수 있다.

 

위에선 생략했지만 ping으로 컨테이너 내부에서 172.17.0.1 주소에 패킷을 날려보면 응답이 온다.

 

문제가 거의 해결된 것 같다. 정확하진 않지만 NAT 환경과 관련된 문제인것 같다.

해결 방법은 여러가지가 있겠지만, 제일 간단한 해결 방법은 컨테이너를 브릿지가 아닌 호스트 방식으로 run하는 것이다.

 

기존에 만든 test 이미지를 과감하게 지우고 host 네트워크로 다시 만들어보겠다.


 

apt-get update 성공

아래 명령어로 test를 삭제하고 네트워크를 host로 지정해서 다시 만들어보자.

$ sudo docker rm test
$ sudo docker run -it --name=test --network=host ubuntu:20.04 /bin/bash

 

쉘이 바뀌었는데 기존처럼 랜덤한 컨테이너 ID가 아니라 host와 같은 내용의 root 쉘이 되었다.

이제 업데이트를 해보자.

$ apt-get update

 

업데이트가 잘 된다. 추가로 필요한 패키지는 apt-get install로 설치하면 될 듯 하다.

해결 방법은 docker run할때 --network=host 라는 옵션을 하나 추가한 것 밖에 없지만 과정은 생각보다 길었던 것 같다.

 

이제 만들어진 ubuntu:20.04 컨테이너에 파이썬과 Django 프레임워크를 설치해서 간단한 웹사이트를 띄워보자.


 

Django 

설치 과정은 https://hwan001.tistory.com/186 글과 같지만 몇 가지 명령어가 다른 점이 있다.

달라진 명령어는 아래 내용에 적어두었다.

 

먼저 apt repository를 국내에서 제공하는 서버로 바꿔주자.

이 글에선 컨테이너 외부의 우분투에 미리 설정되어 있기 때문에 해당 파일을 도커 내부 같은 경로에 cp 명령어로 덮어씌워 줬다.

아래는 /etc/apt/source.list의 내용이고 기존 파일에 kakao 서버 주소만 추가해 주었다.

필요하다면 그대로 사용해도 좋고 다른 국내 서버 주소를 찾아서 추가해줘도 좋다.

 

$ vi /etc/apt/source.list
# deb cdrom:[Ubuntu 20.04.4 LTS _Focal Fossa_ - Release amd64 (20220223)]/ focal main restricted

# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.
deb http://kr.archive.ubuntu.com/ubuntu/ focal main restricted
# deb-src http://kr.archive.ubuntu.com/ubuntu/ focal main restricted


## Major bug fix updates produced after the final release of the
## distribution.
deb http://kr.archive.ubuntu.com/ubuntu/ focal-updates main restricted
# deb-src http://kr.archive.ubuntu.com/ubuntu/ focal-updates main restricted

## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team. Also, please note that software in universe WILL NOT receive any
## review or updates from the Ubuntu security team.
deb http://kr.archive.ubuntu.com/ubuntu/ focal universe
# deb-src http://kr.archive.ubuntu.com/ubuntu/ focal universe
deb http://kr.archive.ubuntu.com/ubuntu/ focal-updates universe
# deb-src http://kr.archive.ubuntu.com/ubuntu/ focal-updates universe

## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team, and may not be under a free licence. Please satisfy yourself as to
## your rights to use the software. Also, please note that software in
## multiverse WILL NOT receive any review or updates from the Ubuntu
## security team.
deb http://kr.archive.ubuntu.com/ubuntu/ focal multiverse
# deb-src http://kr.archive.ubuntu.com/ubuntu/ focal multiverse
deb http://kr.archive.ubuntu.com/ubuntu/ focal-updates multiverse
# deb-src http://kr.archive.ubuntu.com/ubuntu/ focal-updates multiverse

## N.B. software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
deb http://kr.archive.ubuntu.com/ubuntu/ focal-backports main restricted universe multiverse
# deb-src http://kr.archive.ubuntu.com/ubuntu/ focal-backports main restricted universe multiverse

## Uncomment the following two lines to add software from Canonical's
## 'partner' repository.
## This software is not part of Ubuntu, but is offered by Canonical and the
## respective vendors as a service to Ubuntu users.
# deb http://archive.canonical.com/ubuntu focal partner
# deb-src http://archive.canonical.com/ubuntu focal partner

deb http://security.ubuntu.com/ubuntu focal-security main restricted
# deb-src http://security.ubuntu.com/ubuntu focal-security main restricted
deb http://security.ubuntu.com/ubuntu focal-security universe
# deb-src http://security.ubuntu.com/ubuntu focal-security universe
deb http://security.ubuntu.com/ubuntu focal-security multiverse
# deb-src http://security.ubuntu.com/ubuntu focal-security multiverse

# This system was installed using small removable media
# (e.g. netinst, live or single CD). The matching "deb cdrom"
# entries were disabled at the end of the installation process.
# For information about how to configure apt package sources,
# see the sources.list(5) manual.


# kakao
deb http://ftp.daumkakao.com/ubuntu/ bionic main restricted
deb http://ftp.daumkakao.com/ubuntu/ bionic-updates main restricted
deb http://ftp.daumkakao.com/ubuntu/ bionic universe
deb http://ftp.daumkakao.com/ubuntu/ bionic-updates universe
deb http://ftp.daumkakao.com/ubuntu/ bionic multiverse
deb http://ftp.daumkakao.com/ubuntu/ bionic-updates multiverse
deb http://ftp.daumkakao.com/ubuntu/ bionic-backorts main restricted universe multiverse

 

파일을 덮어씌우고 update와 upgrade를 한번씩 더 해줬다.

 

이제 python3, pip3, vim, venv를 apt-get install로 설치한다.

$ apt-get install -y python3 python3-pip python3-venv vim

 

이후 과정은 위 링크와 동일하다.

 

 

 

728x90
반응형

댓글