모도리는 공부중

쌩 우분투 이미지로 개발용 컨테이너 환경 구성하기 본문

내 지식 정리/날것 그 자체

쌩 우분투 이미지로 개발용 컨테이너 환경 구성하기

공부하는 모도리 2024. 1. 26. 19:33
728x90
반응형

컨테이너 만들기 전, 사용하고자 하는 포트가 사용중인 포트와 겹치는지 조회하기

50500부터 50599 사이의 포트를 확인하려면, netstat 또는 ss 명령어를 사용하여 이 범위에 해당하는 포트를 필터링할 수 있습니다. 여기서는 grep 명령어를 사용하여 해당 범위의 포트만 표시되도록 하겠습니다.
  1. netstat 사용하기:
    • netstat -tuln | grep ':505[0-9]\{2\}'
  2. ss 사용하기:

    • ss -tuln | grep ':505[0-9]\{2\}'
이 명령어들은 50500부터 50599 사이에 있는 포트 중에서 현재 열려 있거나 사용 중인 포트들을 보여줄 것입니다. 이 범위 내에서 목록에 나타나지 않는 포트는 사용 중이지 않다고 간주할 수 있습니다.

 

 

쌩 우분투 이미지로 도커 컨테이너 만드는 명령어

#!/bin/bash
#X11

sudo docker run --name [name] \
--net=host \
--privileged \
--ipc=host \
-e TZ="Asia/Seoul" \
-e LANG="ko_KR.UTF-8" \
-e LC_ALL="ko_KR.UTF-8" \
-dit ubuntu:latest /bin/bash

이렇게 만들고 구동시키면..

modory@ubuntu:~/docker-bash$ sudo docker exec -it modory_service_api bash
bash: warning: setlocale: LC_ALL: cannot change locale (ko_KR.UTF-8)

...

root@ubuntu:/# locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=ko_KR.UTF-8
LANGUAGE=
LC_CTYPE="ko_KR.UTF-8"
LC_NUMERIC="ko_KR.UTF-8"
LC_TIME="ko_KR.UTF-8"
LC_COLLATE="ko_KR.UTF-8"
LC_MONETARY="ko_KR.UTF-8"
LC_MESSAGES="ko_KR.UTF-8"
LC_PAPER="ko_KR.UTF-8"
LC_NAME="ko_KR.UTF-8"
LC_ADDRESS="ko_KR.UTF-8"
LC_TELEPHONE="ko_KR.UTF-8"
LC_MEASUREMENT="ko_KR.UTF-8"
LC_IDENTIFICATION="ko_KR.UTF-8"
LC_ALL=ko_KR.UTF-8

된듯, 안된듯, 갈길 잃은 느낌

 

 

컨테이너 내부에서 내가 구성중인 세팅

apt update
apt list --upgradable
apt upgrade -y
apt update

apt install openssh-server vim -y
vim /etc/ssh/sshd_config
	아래 사항들 주석 해제하고 설정 후 저장
    	Port [설정하고 접근할 ssh 포트명]
        PermitRootLogin yes
        PubkeyAuthentication yes
service ssh status
	 * sshd is not running
service ssh start
	 * Starting OpenBSD Secure Shell server sshd
service ssh status
	 * sshd is running
passwd
	설정할 암호
    설정할 암호 한 번 더
     
apt install locales
vim /etc/locale.gen
	esc+/+ko_KR.UTF-8 로 검색, 주석 해제, 저장(esc+:wq)
locale-gen
export LANG=ko_KR.UTF-8
export LC_ALL=ko_KR.UTF-8
locale
	LANG=ko_KR.UTF-8
    LANGUAGE=
    LC_CTYPE="ko_KR.UTF-8"
    LC_NUMERIC="ko_KR.UTF-8"
    LC_TIME="ko_KR.UTF-8"
    LC_COLLATE="ko_KR.UTF-8"
    LC_MONETARY="ko_KR.UTF-8"
    LC_MESSAGES="ko_KR.UTF-8"
    LC_PAPER="ko_KR.UTF-8"
    LC_NAME="ko_KR.UTF-8"
    LC_ADDRESS="ko_KR.UTF-8"
    LC_TELEPHONE="ko_KR.UTF-8"
    LC_MEASUREMENT="ko_KR.UTF-8"
    LC_IDENTIFICATION="ko_KR.UTF-8"
    LC_ALL=ko_KR.UTF-8
date
	확인했을 때 2024. 01. 26. (금) 09:08:46 Asia
apt install tzdata
    Reading package lists... Done
    Building dependency tree... Done
    Reading state information... Done
    The following NEW packages will be installed:
      tzdata
    0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
    Need to get 351 kB of archives.
    After this operation, 3,992 kB of additional disk space will be used.
    Get:1 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 tzdata all 2023d-0ubuntu0.22.04 [351 kB]
    Fetched 351 kB in 2s (218 kB/s)
    debconf: delaying package configuration, since apt-utils is not installed
    Selecting previously unselected package tzdata.
    (Reading database ... 28394 files and directories currently installed.)
    Preparing to unpack .../tzdata_2023d-0ubuntu0.22.04_all.deb ...
    Unpacking tzdata (2023d-0ubuntu0.22.04) ...
    Setting up tzdata (2023d-0ubuntu0.22.04) ...
    debconf: unable to initialize frontend: Dialog
    debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 78.)
    debconf: falling back to frontend: Readline
    Configuring tzdata
    ------------------

    Please select the geographic area in which you live. Subsequent configuration questions will narrow this down by presenting a list of cities,
    representing the time zones in which they are located.

      1. Africa   3. Antarctica  5. Arctic  7. Atlantic  9. Indian    11. US
      2. America  4. Australia   6. Asia    8. Europe    10. Pacific  12. Etc
  입력  Geographic area: 6

    Please select the city or region corresponding to your time zone.

      1. Aden      13. Barnaul     25. Dushanbe     37. Jerusalem     49. Macau         61. Pyongyang      73. Taipei         85. Vientiane
      2. Almaty    14. Beirut      26. Famagusta    38. Kabul         50. Magadan       62. Qatar          74. Tashkent       86. Vladivostok
      3. Amman     15. Bishkek     27. Gaza         39. Kamchatka     51. Makassar      63. Qostanay       75. Tbilisi        87. Yakutsk
      4. Anadyr    16. Brunei      28. Harbin       40. Karachi       52. Manila        64. Qyzylorda      76. Tehran         88. Yangon
      5. Aqtau     17. Chita       29. Hebron       41. Kashgar       53. Muscat        65. Rangoon        77. Tel_Aviv       89. Yekaterinburg
      6. Aqtobe    18. Choibalsan  30. Ho_Chi_Minh  42. Kathmandu     54. Nicosia       66. Riyadh         78. Thimphu        90. Yerevan
      7. Ashgabat  19. Chongqing   31. Hong_Kong    43. Khandyga      55. Novokuznetsk  67. Sakhalin       79. Tokyo
      8. Atyrau    20. Colombo     32. Hovd         44. Kolkata       56. Novosibirsk   68. Samarkand      80. Tomsk
      9. Baghdad   21. Damascus    33. Irkutsk      45. Krasnoyarsk   57. Omsk          69. Seoul          81. Ujung_Pandang
      10. Bahrain  22. Dhaka       34. Istanbul     46. Kuala_Lumpur  58. Oral          70. Shanghai       82. Ulaanbaatar
      11. Baku     23. Dili        35. Jakarta      47. Kuching       59. Phnom_Penh    71. Singapore      83. Urumqi
      12. Bangkok  24. Dubai       36. Jayapura     48. Kuwait        60. Pontianak     72. Srednekolymsk  84. Ust-Nera
  입력  Time zone: 69


    Current default time zone: 'Asia/Seoul'
    Local time is now:      Tue Jan 30 11:27:48 KST 2024.
    Universal Time is now:  Tue Jan 30 02:27:48 UTC 2024.
    Run 'dpkg-reconfigure tzdata' if you wish to change it.
date
	2024. 01. 30. (화) 11:28:28 KST

apt install net-tools
apt install software-properties-common -y
add-apt-repository ppa:deadsnakes/ppa
apt install python3.10 python3.10-dev python3.10-venv -y
apt install pip -y
pip install --upgrade pip
apt install git -y

python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
apt install libmariadb-dev pkg-config libcairo2-dev distro-info -y
sh pipinstall_requirements.txt
	-r requirements.txt

 

 

잘 적용됐는지 확인 및 추가 설정을 이렇게 해줄 수 있음

 

동일한 ssh 포트로 컨테이너를 만들었다가 없애고 다시 만들어서 ssh 오픈을 했다면 아마도 확실하게 ssh 인증키가 막힌다. 이럴 경우, gpt의 대답이 아래와 같다.

  1. VSCode 설정 확인: VSCode의 원격 접속 설정이 올바른지 확인합니다. ~/.ssh/config 파일에 저장된 호스트와 포트 정보가 최신 상태인지 확인합니다.
  2. SSH 키 문제: 이전 컨테이너에 대한 SSH 키가 ~/.ssh/known_hosts 파일에 저장되어 있을 수 있습니다. 이전 호스트의 키와 현재 컨테이너의 키가 일치하지 않으면 문제가 발생할 수 있습니다. 필요한 경우 known_hosts에서 해당 호스트의 기록을 삭제합니다.
  3. SSH 접속 로그 확인: SSH 접속 시도 중 발생하는 에러 메시지 또는 로그를 확인합니다. 이는 문제의 원인을 파악하는 데 도움이 될 수 있습니다.

나의  경우 ~/.ssh/knwon_hosts 파일에서 해당하는 포트가 3줄이길래 그것만 지워주고 다시 시도. 잘 된다.

 

JS의 npm같은 패키지관리 라이브러리가 있길래 반가워서 설치해봤다. poetry라고 한다.

Downloading jaraco.classes-3.3.1-py3-none-any.whl (6.8 kB)
Installing collected packages: trove-classifiers, ptyprocess, fastjsonschema, distlib, urllib3, tomlkit, tomli, shellingham, rapidfuzz, poetry-core, platformdirs, pkginfo, pexpect, packaging, msgpack, jaraco.classes, installer, importlib-metadata, idna, filelock, crashtest, charset-normalizer, certifi, virtualenv, requests, pyproject-hooks, keyring, dulwich, cleo, requests-toolbelt, cachecontrol, build, poetry-plugin-export, poetry
  Attempting uninstall: importlib-metadata
    Found existing installation: importlib-metadata 4.6.4
    Uninstalling importlib-metadata-4.6.4:
      Successfully uninstalled importlib-metadata-4.6.4
  Attempting uninstall: keyring
    Found existing installation: keyring 23.5.0
    Uninstalling keyring-23.5.0:
      Successfully uninstalled keyring-23.5.0
Successfully installed build-1.1.1 cachecontrol-0.14.0 certifi-2024.2.2 charset-normalizer-3.3.2 cleo-2.1.0 crashtest-0.4.1 distlib-0.3.8 dulwich-0.21.7 fastjsonschema-2.19.1 filelock-3.13.1 idna-3.6 importlib-metadata-7.1.0 installer-0.7.0 jaraco.classes-3.3.1 keyring-24.3.1 msgpack-1.0.8 packaging-24.0 pexpect-4.9.0 pkginfo-1.10.0 platformdirs-4.2.0 poetry-1.8.2 poetry-core-1.9.0 poetry-plugin-export-1.7.1 ptyprocess-0.7.0 pyproject-hooks-1.0.0 rapidfuzz-3.7.0 requests-2.31.0 requests-toolbelt-1.0.0 shellingham-1.5.4 tomli-2.0.1 tomlkit-0.12.4 trove-classifiers-2024.3.3 urllib3-2.2.1 virtualenv-20.25.1
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv

뭘... 겁나 많이도 설치시키네..

 

# poetry init

This command will guide you through creating your pyproject.toml config.

Package name [edgesafe_service_api]:
Version [0.1.0]:
Description []:
Author [None, n to skip]:  None
License []:
Compatible Python versions [^3.10]:

Would you like to define your main dependencies interactively? (yes/no) [yes]
You can specify a package in the following forms:
  - A single name (requests): this will search for matches on PyPI
  - A name and a constraint (requests@^2.23.0)
  - A git url (git+https://github.com/python-poetry/poetry.git)
  - A git url with a revision (git+https://github.com/python-poetry/poetry.git#develop)
  - A file path (../my-package/my-package.whl)
  - A directory (../my-package/)
  - A url (https://example.com/packages/my-package-0.1.0.tar.gz)

Package to add or search for (leave blank to skip): fastapi
Found 20 packages matching fastapi
Showing the first 10 matches

Enter package # to add, or the complete package name if it is not listed []:
 [ 0] fastapi
 [ 1] fastapi-framework
 [ 2] fastapi-logger
 [ 3] openeo-fastapi
 [ 4] fastapi-proxiedheadersmiddleware
 [ 5] fastapi-fixed
 [ 6] propelauth-fastapi
 [ 7] fastapi-healthcheck
 [ 8] fastapi-versioning
 [ 9] Uiadmin-FastApi
 [ 10]
 >

 

오 재미있는 라이브러리 많네?

설치 시키고 이번엔 uvicorn 하려는데,

Add a package (leave blank to skip): uvicorn
Found 20 packages matching uvicorn
Showing the first 10 matches

Enter package # to add, or the complete package name if it is not listed []:
 [ 0] uvicorn
 [ 1] uvicorn-worker
 [ 2] uvicorn-httparse
 [ 3] uvicorn-http2
 [ 4] foodalgo-uvicorn
 [ 5] uvicorn-tschaume
 [ 6] uvicorn-trailers
 [ 7] fps-uvicorn
 [ 8] uvicorn-logger
 [ 9] uvicorn-manager
 [ 10]
 >

오호??

 

sqlalchemy!

Add a package (leave blank to skip): sqlalchemy
Found 20 packages matching sqlalchemy
Showing the first 10 matches

Enter package # to add, or the complete package name if it is not listed []:
 [ 0] SQLAlchemy
 [ 1] sqlalchemy_basemodel
 [ 2] tiddlywebplugins.sqlalchemy3
 [ 3] sqlalchemy-timescaledb
 [ 4] sqlalchemy-privileges
 [ 5] ray_sqlalchemy
 [ 6] dagster-sqlalchemy
 [ 7] polymorphic-sqlalchemy
 [ 8] SQLAlchemy-mmeyer724
 [ 9] risclog.sqlalchemy
 [ 10]

 

mariadb!

Add a package (leave blank to skip): mariadb
Found 20 packages matching mariadb
Showing the first 10 matches

Enter package # to add, or the complete package name if it is not listed []:
 [ 0] mariadb
 [ 1] mariadb-kernel
 [ 2] MariaDB-SQLBuilder
 [ 3] mariadb-dyncol
 [ 4] dictum-backend-mariadb
 [ 5] tencentcloud-sdk-python-mariadb
 [ 6] ntmirror
 [ 7] snweatherstation
 [ 8] scipion-em-ispyb
 [ 9] libhdbpp-python
 [ 10]
 >

 

여차저차 설치 다하고 나오니까 toml 파일이 생성은 됐는데, 그냥 toml 파일에 명시만 된 것 같고 설치된 것 같아보이진 않는다.

프로젝트 디렉토리 내부에 가상환경을 생성하고자 하므로 아래와 같은 작업을 거친다.

# poetry env info

Virtualenv
Python:         3.10.12
Implementation: CPython
Path:           NA
Executable:     NA

Base
Platform:   linux
OS:         posix
Python:     3.10.12
Path:       /usr
Executable: /usr/bin/python3.10


# poetry config virtualenvs.in-project true


# poetry shell
Creating virtualenv edgesafe-service-api in /home/works/project_name/.venv
Spawning shell within /home/works/project_name/.venv

 

가상환경을 프로젝트 내부로 설치되도록 작업 후 env info를 다시 확인하면 변한 게 없다.

poetry shell을 하면 가상환경이 자동으로 생성되는데, 내가 생성한 프로젝트명과 파이썬 버전명이 같이 기록돼서 만들어진다. 내가 직접 python3 -m venv .venv할 때는 가상환경명이 간단했는데, poetry는 약간 anaconda때 가상환경 만들던 느낌이 난다.

생성 후 다시 확인하면 조금 달라진다.

(project-name-py3.10) # poetry env info

Virtualenv
Python:         3.10.12
Implementation: CPython
Path:           /home/works/project_name/.venv
Executable:     /home/works/project_name/.venv/bin/python
Valid:          True

Base
Platform:   linux
OS:         posix
Python:     3.10.12
Path:       /usr
Executable: /usr/bin/python3.10

 

이제 아까 poetry init할 때 작성했던 의존성들을 설치한다.

-- 모든 의존성 설치
# poetry install

-- 프로덕션 의존성만 설치 (개발 의존성 제외)
# poetry install --no-dev

 

설치하고 나면 pyproject.toml 파일은 변화 없지만 주 의존성과 하위 의존성의 버전이 명시된 poetry.lock 파일이 생성된다.

 

 

6/13 ~ 추가

우분투 이미지로 컨테이너 만들어놓고 이 작업 거치는 거 진심 너무 귀찮아서 나만의 이미지를 추가로 만들어야겠다 싶어진다. gpt한테 이 포스팅 주면서 만들어주라고 했더니 아래와 같이 뭔가를 만들어 줌. (최종 선택 방법은 아래 파일이 아님)

# 1. 베이스 이미지 선택
FROM ubuntu:20.04

# 2. 필요 패키지 업데이트 및 설치
RUN apt-get update && \
    apt-get install -y python3 python3-pip locales openssh-server curl

# 3. 로케일 설정
RUN locale-gen ko_KR.UTF-8
ENV LANG ko_KR.UTF-8
ENV LANGUAGE ko_KR:ko
ENV LC_ALL ko_KR.UTF-8

# 4. 타임존 설정
RUN ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime && \
    echo "Asia/Seoul" > /etc/timezone

# 5. SSH 설정
RUN mkdir /var/run/sshd
RUN echo 'root:password' | chpasswd
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config

# 6. Poetry 설치
RUN curl -sSL https://install.python-poetry.org | python3 -

# 7. 작업 디렉토리 설정
WORKDIR /usr/src/app

# 8. 필요한 패키지 설치 (예: 프로젝트의 requirements.txt가 있다면)
# COPY requirements.txt ./
# RUN pip install --no-cache-dir -r requirements.txt

# 9. 컨테이너가 실행될 때 시작할 명령 설정 (여기서는 SSH 서버 실행)
CMD ["/usr/sbin/sshd", "-D"]

이걸로 이미지 하나 만들어서 컨테이너 임시로 만들고 테스트 후 지워볼까? 생각된다.

임시로 만들고 지워주는 명령어는 아래와 같다.

docker run --rm -it --entrypoint sh <이미지 이름 또는 이미지 ID>

위 명령어는 컨테이너를 만들자마자 특정 케이스만 확인하고 바로 끌 요량이 아니라면,

스크립트 파일로 만들어서 sh 명령어로 구동시키는 순간 아무런 의미가 없어진다. 

 

우분투 20.04로 설치해서 python3 --version해봤더니 3.8.10이 뜬다. GPT에게 질문.

Ubuntu 20.04 (Focal Fossa)
- 기본 Python 버전: Python 3.8.10
- 패키지 관리 시스템(apt)에서 제공하는 기본 Python 3 버전이 Python 3.8.10입니다.
Ubuntu 22.04 (Jammy Jellyfish)
- 기본 Python 버전: Python 3.10.6
- 우분투 22.04에서는 Python 3.10.x 시리즈가 기본으로 설치됩니다.
- 최신 우분투 릴리스이기 때문에 Python의 최신 버전을 제공합니다.

 

우분투가 데비안 기반이라는 건 알겠고..

https://sl.bing.net/kjzkCjJKBgW

 

Copilot이란? - Bing

Bing은 지능적인 검색 기능은 사용자가 원하는 정보를 빠르게 검색하고 보상을 제공합니다.

www.bing.com

도커파일에 설정을 걸 때, 이미지를 빌드하는 시점에 거는 설정과, 컨테이너를 생성하는 시점에 거는 설정법이 다르다는 것을 bing과 대화하면서 추가로 알게 됨.

 

 

Ubuntu v20.04, python v3.8

# 1. 베이스 이미지 선택
FROM ubuntu:20.04

# 2. 환경 변수 설정 (대화형 입력 방지 및 시간대 설정)
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Seoul

# 3. 필요 패키지 업데이트 및 설치
RUN apt-get update && \
    apt-get install -y \
    tzdata \
    python3 \
    python3-pip \
    locales \
    openssh-server \
    curl \
    net-tools \
    git && \
    apt-get clean

# 4. 로케일 설정
RUN locale-gen ko_KR.UTF-8
ENV LANG=ko_KR.UTF-8
ENV LANGUAGE=ko_KR:ko
ENV LC_ALL=ko_KR.UTF-8

# 5. 타임존 설정 (ENV에서 설정된 TZ 변수 사용)
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# 6. SSH 설정
RUN mkdir /var/run/sshd
RUN echo 'root:password' | chpasswd
RUN sed -i 's/#Port 22/Port 2222/' /etc/ssh/sshd_config
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed -i 's/#PubkeyAuthentication yes/PubkeyAuthentication yes/' /etc/ssh/sshd_config

# 7. Poetry 설치 및 PATH 설정
RUN curl -sSL https://install.python-poetry.org | python3 -
ENV PATH="/root/.local/bin:$PATH"

# 8. 작업 디렉토리 설정 (미설정 시 /)
# WORKDIR /usr/src/app

# 기본적으로 SSH 데몬 실행
CMD ["/usr/sbin/sshd", "-D"]

 

Ubuntu v22.04, python v3.10

# 1. 베이스 이미지 선택
FROM ubuntu:22.04

# 2. 환경 변수 설정 (대화형 입력 방지 및 시간대 설정)
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Seoul

# 3. 필요 패키지 업데이트 및 설치
RUN apt-get update && \
    apt-get install -y \
    tzdata \
    python3 \
    python3-pip \
    locales \
    openssh-server \
    curl \
    net-tools \
    git && \
    apt-get clean

# 4. 로케일 설정
RUN locale-gen ko_KR.UTF-8
ENV LANG=ko_KR.UTF-8
ENV LANGUAGE=ko_KR:ko
ENV LC_ALL=ko_KR.UTF-8

# 5. 타임존 설정 (ENV에서 설정된 TZ 변수 사용)
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# 6. SSH 설정
RUN mkdir /var/run/sshd
RUN echo 'root:password' | chpasswd
RUN sed -i 's/#Port 22/Port 2222/' /etc/ssh/sshd_config
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed -i 's/#PubkeyAuthentication yes/PubkeyAuthentication yes/' /etc/ssh/sshd_config

# 7. Poetry 설치 및 PATH 설정
RUN curl -sSL https://install.python-poetry.org | python3 -
ENV PATH="/root/.local/bin:$PATH"

# 8. 작업 디렉토리 설정 (미설정 시 /)
# WORKDIR /usr/src/app

# 기본적으로 SSH 데몬 실행
CMD ["/usr/sbin/sshd", "-D"]

 

Dockerfile로 Docker image 생성

docker build -t my-ubuntu-python .

 

Docker image로 Docker container 실행하는 sh 스크립트

docker run --rm --name my-container \
--net=host \
--privileged \
--ipc=host \
-dit my-ubuntu-python /bin/bash

 

컨테이너 내부에서 Dockerfile에 기재한 내용이 잘 설정되었는지 확인하는 명령어

# 1. 타임존
cat /etc/timezone
date

# 2. 로케일
locale

# 3. python 버전
python3 --version

# 4. poetry 버전
poetry --version

# 5. ssh 설정
grep -E "^Port|^PermitRootLogin|^PubkeyAuthentication" /etc/ssh/sshd_config

현 상태는 service ssh status 명령어로 확인했을 때 sshd is not running 이 뜨는 게 맞다.

안전을 위해 컨테이너 실행 후 service ssh status로 상태 확인 후 service ssh start를 하는 것을 권고.

 

위와 같이 현재 도커파일 상태는 이미지 빌드 시점에 ssh에 대한 설정을 바로 걸고 시작한다. 고로, 이미지가 빌드될 때 설정이 완료된 상태일 것이므로 컨테이너를 새로 만들 일이 있을 때는 내가 원하는 이미지부터 만들어야 한다.

도커파일에 작성된 Port를 확인하고 실행하려는 환경에 맞게 설정을 바꾼 후 해야 한다.

이게 귀찮고.. 도커파일 확인 안하고 그냥 할 가능성도 분명히 있다. (내 생각에 분명하다.)

그럼 이미지는 만들어두고, 컨테이너를 생성하는 시점에 환경변수로 전달해서 매번 새롭게 설정할 수 있도록 하는 부분이 필요하다고 본다. 그래야 편히 사용하려는 목적 달성이 되지.

 

Dockerfile (아마도 최종)

# 1. 베이스 이미지 선택 (20.04 or 22.04)
FROM ubuntu:20.04

# 2. 환경 변수 설정 (기본값 제공)
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Seoul

# 3. 필요 패키지 업데이트 및 설치
RUN apt-get update && \
    apt-get install -y \
    tzdata \
    python3 \
    python3-pip \
    locales \
    openssh-server \
    curl \
    net-tools \
    git && \
    apt-get clean

# 4. 로케일 설정
RUN locale-gen ko_KR.UTF-8
ENV LANG=ko_KR.UTF-8
ENV LANGUAGE=ko_KR:ko
ENV LC_ALL=ko_KR.UTF-8

# 5. 타임존 설정 (ENV에서 설정된 TZ 변수 사용)
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# 6. SSH 설정 (빌드 시점에 설정하지 않음)
RUN mkdir /var/run/sshd

# 7. Poetry 설치 및 PATH 설정
RUN curl -sSL https://install.python-poetry.org | python3 -
ENV PATH="/root/.local/bin:$PATH"

# 8. 작업 디렉토리 설정
WORKDIR /usr/src/app

# 9. 기본 명령 설정 (환경 변수를 사용하여 실행 시 설정)
CMD bash -c "sed -i 's/#Port 22/Port ${SSH_PORT}/' /etc/ssh/sshd_config && \
             echo 'root:${ROOT_PASSWORD}' | chpasswd && \
             sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config && \
             sed -i 's/#PubkeyAuthentication yes/PubkeyAuthentication yes/' /etc/ssh/sshd_config && \
             service ssh start && \
             exec /usr/sbin/sshd -D"

Dockerfile로 Docker image 생성

docker build -t my-ubuntu-python .

 

Docker image로 Docker container 실행하는 sh 스크립트

docker run --rm --name my-container \
--net=host \
--privileged \
--ipc=host \
-e SSH_PORT=2222 \  # 원하는 SSH 포트로 설정
-e ROOT_PASSWORD=mysecurepass \  # 원하는 비밀번호로 설정
-dit my-ubuntu-python

 

 

 

 

 

 

참고 링크

[Docker] vscode에서 Container 직접적으로 연결하기 (feat. ssh) (tistory.com)

[Python] Ubuntu 18.04 파이썬 3.10 버전 설치 및 기본 설정하기 (tistory.com)

 

 

 

728x90
반응형
Comments