dockerhub에서 Anaconda 설치된 컨테이너 이미지는 이미 많이 제공된다.
해당 글에서는 dockerhub에 가장 기본인 officer ubuntu docker 이미지를 활용하여 anaconda 환경을 구축하고자 한다.
1. 도커 설치 확인
window내 docker가 정상적으로 설치가 되어 있다면 window 실행창에서 아래와 같이 확인 할 수 있다.
>docker version
Client:
Cloud integration: 1.0.14
Version: 20.10.6
API version: 1.41
Go version: go1.16.3
Git commit: 370c289
Built: Fri Apr 9 22:49:36 2021
OS/Arch: windows/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.6
API version: 1.41 (minimum version 1.12)
Go version: go1.13.15
Git commit: 8728dd2
Built: Fri Apr 9 22:44:56 2021
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.4.4
GitCommit: 05f951a3781f4f2c1911b05e61c160e9c30eaa8e
runc:
Version: 1.0.0-rc93
GitCommit: 12644e614e25b05da6fd08a38ffa0cfe1903fdec
docker-init:
Version: 0.19.0
GitCommit: de40ad0
2. ubuntu 이미지 다운
도커가 정상적으로 설치되었다면 dockerhub에서 가입한 후 이미지를 다운 받는다.
URL : https://hub.docker.com/_/ubuntu
Docker Desktop이 로그인이 되어있고, 정상적으로 수행되어 있다면 docker pull 명령어를 통해 이미지를 다운 받을 수 있다.
>docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
Digest: sha256:cf31af331f38d1d7158470e095b132acd126a7180a54f263d386da88eb681d93
Status: Image is up to date for ubuntu:latest
docker.io/library/ubuntu:latest
3. 이미지 확인
이미지가 정상적으로 다운되었다면, docker images 명령어를 통해 이미지를 확인할 수 있다.
>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 7e0aa2d69a15 3 weeks ago 72.7MB
4. ubuntu 컨테이너 실행
>docker run -it -d ubuntu
620f470bfabb9ba262ceae0a117abace30203a0e42f08383bdfe583fda058d5e
>docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
620f470bfabb ubuntu "/bin/bash" 8 seconds ago Up 7 seconds elated_hawking
이미지 실행 시, -it 옵션은 반드시 들어가야 한다.
해당 옵션을 주지 않으면 컨테이너 start가 되지 않는다.
아래 메뉴얼을 확인해보면 쉘과 같은 tty를 활용하려면 -it옵션이 필수 인 것으로 확인된다.
내용이 어렵지만 더 공부 해봐야 겠다.
https://docs.docker.com/engine/reference/run/
$ docker run -a stdin -a stdout -i -t ubuntu /bin/bash
대화 형 프로세스 (예 : 쉘)의 -i -t경우 컨테이너 프로세스에 tty를 할당 하려면 함께 사용해야합니다 . 나중에 예에서 볼 수 있듯이 -i -t종종 작성 -it됩니다. -t클라이언트가 다음과 같이 파이프에서 표준 입력을받는 경우 지정 이 금지됩니다.
-d 옵션은 백그라운드로 프로세스가 작동하는 옵션이다.
도커의 이미지와 컨테이너는 다르다.
개념을 잡기 전까지 도커 내에서 가장 해깔리는 개념이라고 생각이 든다.
도커 메뉴얼에는 아래와 같이 이미지와 컨테이너를 정의한다.
URL : https://docs.docker.com/get-started/overview/
이미지
이미지 도커 컨테이너를 만들기위한 지침 읽기 전용 템플릿입니다. 종종 이미지는 몇 가지 추가 사용자 정의와 함께 다른 이미지를 기반으로 합니다. 예를 들어 이미지를 기반으로하는 이미지를 빌드 할 수 ubuntu 있지만 Apache 웹 서버와 애플리케이션은 물론 애플리케이션을 실행하는 데 필요한 구성 세부 사항도 설치합니다.
자신의 이미지를 만들 수도 있고 다른 사람이 만들고 레지스트리에 게시 한 이미지 만 사용할 수도 있습니다. 자체 이미지를 빌드하려면 이미지 를 생성하고 실행하는 데 필요한 단계를 정의하는 간단한 구문 으로 Dockerfile 을 생성합니다. Dockerfile의 각 명령어는 이미지에 레이어를 만듭니다. Dockerfile을 변경하고 이미지를 다시 빌드하면 변경된 레이어 만 다시 빌드됩니다. 이것은 다른 가상화 기술과 비교할 때 이미지를 매우 가볍고, 작고, 빠르게 만드는 요소의 일부입니다.
컨테이너
컨테이너는 이미지의 실행 가능한 인스턴스입니다. Docker API 또는 CLI를 사용하여 컨테이너를 생성, 시작, 중지, 이동 또는 삭제할 수 있습니다. 컨테이너를 하나 이상의 네트워크에 연결하거나 스토리지를 연결하거나 현재 상태를 기반으로 새 이미지를 만들 수도 있습니다.
기본적으로 컨테이너는 다른 컨테이너 및 호스트 시스템과 비교적 잘 격리되어 있습니다. 컨테이너의 네트워크, 스토리지 또는 기타 기본 하위 시스템이 다른 컨테이너 또는 호스트 시스템에서 분리되는 방식을 제어 할 수 있습니다.
컨테이너는 이미지뿐만 아니라 생성하거나 시작할 때 제공하는 구성 옵션으로 정의됩니다. 컨테이너가 제거되면 영구 저장소에 저장되지 않은 상태 변경 사항이 사라집니다.
컨테이너가 이미지가 실행 된 인스턴스이기 때문에 우리는 실제 작업 수행 패키지 설치, 소스 구현 등은 컨테이너에서 구현이 되기 때문에 이제부터는 컨테이너 상에서 작업을 수행 한다.
5. 컨테이너 내 ubuntu 설정
>docker exec -it 620f470bfabb /bin/bash
root@620f470bfabb:/#
root@620f470bfabb:/# apt-get update
Get:1 http://security.ubuntu.com/ubuntu focal-security InRelease [114 kB]
Get:2 http://archive.ubuntu.com/ubuntu focal InRelease [265 kB]
Get:3 http://security.ubuntu.com/ubuntu focal-security/main amd64 Packages [828 kB]
....
root@620f470bfabb:/# apt-get install wget
Reading package lists... Done
Building dependency tree
....
root@620f470bfabb:/# useradd test
root@620f470bfabb:/# mkdir /home/test
root@620f470bfabb:/# chown test:test /home/test
root@620f470bfabb:/# su - test
docker exec 명에 CONTAINER ID 값(620f470bfabb)를 입력하면 해당 컨테이너에 접속하여 작업을 진행할 수 있다
인터넷망과 연결된 환경에서는 apt-get을 사용할 수 있으며, update를 명령어를 통해 repo 갱신을 한 후 패키지를 다운 받을 수 있다
ubuntu container 환경에서는 /home directory가 있지만 유저를 추가하더라도 디렉토리가 자동 생성되지 않는다.
유저를 추가한 후 디렉토리 별도 생성, 권한 생성을 하면 일반적인 환경과 동일한 형태의 유저 환경을 설정할 수 있다.
5. 컨테이너 내 anaconda 설치
$ source
sh: 1: source: not found
$ exec bash
(base) test@620f470bfabb:~$
(base) test@620f470bfabb:~$ source
bash: source: filename argument required
source: usage: source filename [arguments]
test@620f470bfabb:~$ wget https://repo.anaconda.com/archive/Anaconda3-2021.05-Linux-x86_64.sh
--2021-05-19 07:21:20-- https://repo.anaconda.com/archive/Anaconda3-2021.05-Linux-x86_64.sh
Resolving repo.anaconda.com (repo.anaconda.com)... 104.16.131.3, 104.16.130.3, 2606:4700::6810:8203, ...
Connecting to repo.anaconda.com (repo.anaconda.com)|104.16.131.3|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 570853747 (544M) [application/x-sh]
Saving to: 'Anaconda3-2021.05-Linux-x86_64.sh'
Anaconda3-2021.05-Linux-x86_64.sh 100%[========================================================================================================================================>] 544.41M 32.8MB/s in 17s
2021-05-19 07:21:37 (33.0 MB/s) - 'Anaconda3-2021.05-Linux-x86_64.sh' saved [570853747/570853747]
test@620f470bfabb:~$ sh Anaconda3-2021.05-Linux-x86_64.sh
Welcome to Anaconda3 2021.05
In order to continue the installation process, please review the license
agreement.
Please, press ENTER to continue
>>>
===================================
End User License Agreement - Anaconda Individual Edition
===================================
Copyright 2015-2021, Anaconda, Inc.
All rights reserved under the 3-clause BSD License:
...
Do you accept the license terms? [yes|no]
[no] >>> yes
Anaconda3 will now be installed into this location:
/home/test/anaconda3
- Press ENTER to confirm the location
- Press CTRL-C to abort the installation
- Or specify a different location below
[/home/test/anaconda3] >>>
PREFIX=/home/test/anaconda3
Unpacking payload ...
Collecting package metadata (current_repodata.json): done
Solving environment: done
...
Preparing transaction: done
Executing transaction: done
installation finished.
Do you wish the installer to initialize Anaconda3
by running conda init? [yes|no]
[no] >>> yes
Anaconda3-2021.05-Linux-x86_64.sh: 463: [[: not found
no change /home/test/anaconda3/condabin/conda
no change /home/test/anaconda3/bin/conda
no change /home/test/anaconda3/bin/conda-env
no change /home/test/anaconda3/bin/activate
no change /home/test/anaconda3/bin/deactivate
no change /home/test/anaconda3/etc/profile.d/conda.sh
no change /home/test/anaconda3/etc/fish/conf.d/conda.fish
root@620f470bfabb:/# su - test
$ exec bash
(base) test@620f470bfabb:~$
(base) test@620f470bfabb:~$
(base) test@620f470bfabb:~$
(base) test@620f470bfabb:~$ python
Python 3.8.8 (default, Apr 13 2021, 19:58:26)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
docker ubuntu 환경에서 유저를 생성 한 후 source 명령어를 치면, 제대로 해석이 안되는 이슈가 발생한다.
WSL과 ubuntu 환경의 호환성 문제인거로 예상이되며, 다행히 exec bash 명령어를 수행하면 정상적으로 수행된다.
exec bash가 수행되지 않으면, 추후 anaconda를 설치하더라도 정상적으로 수행되지 않는다.
도커 생성 완료 후 OS 환경 문제인지, 도커 이미지 이슈인지 더 확인해볼 예정이다.
생성된 유저환경에서 wget을 통해 Anaconda 설치 파일을 다운 받은 후 sh 명령어를 통해 설치를 진행하면 된다.
licence term의 경우 yes를 해야만하며, prefix 디렉토리를 설정하면 해당 경로에 설치를 진행할 수 있다
running conda의 경우에 yes를 설정하면 설치가 모두 완료된다.
6. 컨테이너 커밋
컨테이너의 경우 4번 설명과 같이 인스턴스이기 때문에 컨테이너가 종료되면 기존에 저장된 내용이 사라지게 된다.
해당 경우를 방지하여 volume 설정을 통한 방법이 있지만, 이번 글에서는 커밋을 한후 종료할 예정이다.
>docker commit -m "anaconda install success" 620f470bfabb ubuntu_anaconda:0.1
sha256:c6eeb8f4491a357de1b3179827ae4e172b97be6754d98001b34afc9893fa5ae6
>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu_anaconda 0.1 c6eeb8f4491a 4 seconds ago 4.16GB
ubuntu latest 7e0aa2d69a15 3 weeks ago 72.7MB
>docker run -it -d ubuntu_anaconda:0.1
9aa716f6c266585c7c801ffebf44ef56f336533610b065dd4513f076baf0d45b
>docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9aa716f6c266 ubuntu_anaconda:0.1 "/bin/bash" 5 seconds ago Up 2 seconds unruffled_galois
bb48f08ac38b ubuntu "/bin/bash" 39 minutes ago Exited (0) 39 minutes ago vigorous_faraday
620f470bfabb ubuntu "/bin/bash" About an hour ago Up About an hour elated_hawking
>docker exec -it 9aa716f6c266 /bin/bash
root@9aa716f6c266:/# su - test
$ exec bash
(base) test@9aa716f6c266:~$ python3
Python 3.8.8 (default, Apr 13 2021, 19:58:26)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
dokcer는 commit 명령어를 통해 이미지를 업데이트할 수 있으며 TAG를 통하여 버전관리를 진행할 수 있다
docker의 업데이트는 지속적으로 업데이트가 될 예정이지만, 이번에는 새로운 이미지를 만드는 방식으로 진행한다.
>docker commit --help
Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
dokcer comit 명령어의 -m 옵션은 메세지 옵션으로 변경된 내용을 작성하면 되며,
CONTAINER에는 현재의 CONTAINER 명(620f470bfabb) [REPOSITORY[:TAG]]은 이미지 명과 태그를 입력하면된다.
commit이 완료된 후에 images 명령어를 통해 이미지 생성된 것(ubuntu_anaconda:01)을 확인한다.
run 명령어를 통해 새로이 생성된 이미지를 실행하고 수행되는지 확인 및 접속을 진행한다.
test 계정에 접속하여 python3이 정상적으로 접속되면 작업이 완료된다.
'docker' 카테고리의 다른 글
[docker] jupyter-notebook 이미지를 이용한 jupyterlab 실행 (0) | 2021.05.19 |
---|---|
[docker] window docker 설치 (0) | 2021.05.19 |