본문 바로가기

DataEnginner/Docker

Docker(도커) 를 사용하면서 필요한 기본적인 명령어

이 글은 리눅스(우분투) 기준으로 작성되었습니다.


Docker 설치

$ curl -fsSL https://get.docker.com/ | sudo sh

sudo를 제외해서 명령어 사용하기

$ sudo usermod -aG docker your-user # your-user 사용자에게 권한주기

$ sudo usermod -aG docker $USER # 현재 접속중인 사용자에게 권한주기

도커 버전확인

$ docker version

Docker image는 docker hub 에 들어가서 검색할 수 있지만 귀찮다면

$ docker search python

$ docker search [필요한 라이브러리]

출처 : subicura.com/2017/01/19/docker-guide-for-beginners-2.html


'Dockerfile'을 작성할때 기본 :

  • FROM : 어떤 base 컨테이너로부터 만들어 지는 이미지인지 기술한다.
  • RUN : bash 쉘에서 입력하는것과 동일한 명령어를 기술한다.
  • ADD : 호스트의 파일 시스템으로부터 파일을 가져와서 이미지를 더한다.

 

 


'Dockerfile'을 실행할 때 :

 

$ docker build . -t flask

$ docker build [경로] -t [docker name]

 -> docker 초보분들을 위해 설명하자면 docker name은 임의로 자기가 docker에 별명을 붙이는거라고 생각하면된다.

docker가 어떤 이미지로 베이스를 하든 어떤 것을위해 하든 중요하지않고 자기가 편한대로 이름을 붙이면 된다.


docker는 개인적으로 다른 사람이 만들어 놓은 image를 갖다 쓰고 그위에 내가 필요한 라이브러리를 설치하는것이 편하나

필요에 따라서는 docker image를 만들고 github마냥 docker hub에 공유하고 필요에 따라 다른 컴퓨터에서 바로 사용할 수 있다.

파이썬은 특히 개발을 하다보면 의존성 문제가 있기때문에 라이브러리도 순서에 맞게 다운받지않으면 실행이 안될수가 있는데 docker파일을 한번만 작성해놓으면 어디서든 명령어 한두줄에 개발환경이 구성되는 것을 볼 수 있다.

이전에는 아나콘다를 이용해서 가상환경을 구성해서 사용했었는데 docker에 익숙해보도록 노력이 필요한듯 싶다.


컨테이너 실행

$ docker run --name flask flask_api:0.01(<명령어>)(<인자>)

$ docker run (<옵션>) <이미지 식별자> (<명령어>) (<인자>)

*옵션값 *

-d : background 실행

-p : 포트 설정

-e : 컨테이너의 환경 변수 설정

--name : 컨테이너에 이름 부여

-it : 컨테이너를 종료하지 않은 체로 터미널의 입력을 계속해서 컨테이너로 전달하기 위해 사용

-v : 컨테이너에 호스트 볼륨(volumn) 마운트

-w : Dockerfile WORKDIR 설정을 덮어쓰기 (작업디렉토리 변경)

--privileged : 모든 장치에 접근할 수 있는 커널의 기능을 대부분 사용가능

--detach : backgound 실행 -d 와 같음.

--mount : -v 와 다른 점은 host에서도 수정가능.

 

--rm : 컨테이너가 종료될 때 컨테이너와 관련된 리소스(파일시스템, 볼륨)까지 깨끗이 제거 (로컬과 연결된 볼륨이 삭제되지는 않는다.)

사용하지 않는 이미지 삭제

$docker image prune

실행중인 컨테이너 확인

$docker ps

정지된 컨테이너까지 확인

$ docker ps -a

*컨테이너 정지 *

$ docker stop c967caba3f01

$ docker stop [CONTAINER ID]

사용하지 않은 이미지를 지울때 명령어

$ sudo docker rmi hello-world:latest

$sudo docker rmi [컨테이너이름 : tag]

사용하지 않은 컨테이너 id 삭제

$ sudo docker rmi -f c967caba3f01

$ sudo docker rmi -f [컨테이너 id]

-f : f는 force를 뜻하는 단어로 강제로 하는 것을 말한다. 실패한 도커파일 다지우고싶은데 하다하다 안될때 사용 확실하다면 사용한다.

컨테이너까지 지울 때

$sudo docker rmi -f hello-world:latest

$sudo docker rmi -f [컨테이너이름 : tag]

*컨테이너 시작 *

$ docker start flask_api

$ docker start [컨테이너 이름 혹은 아이디]

컨테이너 접속

$ sudo docker attatch falsk_api

$ sudo docker attatch [컨테이너 이름 혹은 아이디]

실행중인 컨테이너 재부팅

$ docker restart flask_api

$ docker restart [컨테이너 이름 혹은 아이디]

실행중인 생성 및 실행

$ docker run -d --name mycontainer -p 80:80 myimage

$ docker run -d --name [지정하고싶은 컨테이너이름] -p 80:80 [docker imagename]

실행중인 docker에 명령어 실행

$ docker exec 610fd7d18365 ls

$ docker exec [container id] [명령어]


현재 작업해놓은 컨테이너 Docker container에 저장 (컨테이너 구동중에)

$ docker commit 977bd1a14aa6 airflow_ex:0.01

$ docker commit [containerID] [image_name]:[tag]


도커 컨테이너 : 공유 디렉터리 연결하기

도커 컨테이너를 구동하는 로컬 호스트 시스템과 도커 컨테이너 간에 고유 디렉터리(폴더)를 연결(마운트)하는 방법

$ docker -v /home/name:/home/work dockerimage:0.01

$ docker -v [host system directory]:[container directory] [image name]

$ docker run -it --volume = "$PWD:/home/work" dockerimage:0.01

$ docker run -it --volume = [경로명령어:도커내부경로] [image name]


기존 docker 파일에 jupyter-notebook 추가 시키는 방법

RUN pip install jupyter

RUN jupyter notebook --generate-config --allow-root

RUN echo "c.NotebookApp.password = u'sha1:6a3f528eec40:6e896b6e4828f525a6e20e5411cd1c8075d68619'" >> /root/.jupyter/jupyter_notebook_config.py

EXPOSE 8888

ENTRYPOINT jupyter notebook --allow-root --ip=0.0.0.0 --port=8888 --no-browser

기존 Dockerfile에 위와 같은 내용을 추가하고 docker 파일을 빌드하고 실행시키면

http://localhost:8888/ 에 접속했을때 토큰 비밀번호 root로 접속 가능하다 .

$ docker run -it --rm -p 8888:8888 -v `pwd`:~/home/flask_api flsk_api:0.02 .

$ docker run -it --rm -p 8888:8888 -v `pwd`:[경로] [docker build name]:[tag] [로컬경로]

참고 : tobelinuxer.tistory.com/26


docker run 메뉴 설명

  • [-p 8090:8080] : host의 8090에 container의 8080 port를 맵핑합니다.
  • [-v /c/Docker:/shared] : host의 /c/Docker 폴더를 container의 /shared 폴더에 마운트합니다.

출처:https://dhznsdl.tistory.com/19


'error response from daemon: conflict: unable to remove repository reference "hello-world:latest" (must force) - container 5b92f744430d is using its referenced image d1165f221234'

container를 지울 때 이러한 오류가 뜬다면

*모든 컨테이너 목록 출력 *

$ sudo docker ps -as

이렇게 이미지를 검색했을때 names에 hello-world 이미지는 angry_keller라는 네임을 갖고있다.

이때

$ sudo docker rm angry_keller

                           \[names\]

로 삭제해주고 다시

$ sudo docker rmi hello-world:latest

을 해주면 잘 삭제된다.

그외

REPOSITORY TAG

으로 되있는 실패한 docker image를 삭제하고 싶을때 방법 명령어

$ docker rmi $(docker images -f "dangling=true" -q)


실행중인 컨테이너 터미널로 전환하기

$ docker exec -it airflowex bash

$ docker exec -it [실행중인 컨테이너 이름] bash

\

$ docker container attach sample

$ docker container attach [컨테이너이름 ]


docker hub 에 푸쉬방법 :

  1. http://hub.docker.com 에 접속
  2. (계정이 없다면 회원가입)
  3. 상단의 'Repositories' 클릭
  4. 상단에 'Create Repository' 버튼 클릭
  5. 이름만 지어주고 Create
  6. 로컬 터미널(터미널의 현재 경로에 Dokcerfile이 있을 때) 에서
  7. $ docker login 입력 후 Docker hub id 및 passoword 입력
  8. $ docker build -t [docker hub id]/[repositoryname]:[tag] .
  9. docker push [docker hub id]/[repositoryname]:[tag]

*다운 받은 컨테이너 설치 후 필요 라이브러리 설치하여 내 도커허브에 저장하기 *

  1. docker search를 통해서 pull 한다.**
  2. docker run 을 통해 실행 **
  3. 다른 터미널창을 열어서 $ docker exec -it [CONTANIER ID] bash 입력**
  4. 터미널에서 필요 라이브러리 설치 ex) pip install xxxxxxx**
  5. exit로 터미널 빠져나온뒤 로컬 터미널에서 $ docker commit [containerid] [dockerhubid][dockerimage]:[tag]**
    • 도커 레파지토리는 미리 만들어놔야함.

Docker images 태그관리에 관한 고민

현재 태그를 보면 내가 일일히 기억해서 hub에 업로드 해주거나 하는 방법밖에 없다.

개인적으로 최종버전은 default인 lastest하고 나머지는 알아서 숫자가 붙여줬음 좋겟는데...


** docker 저장소 확인**

$ docker volume ls

** 특정 볼륨의 상세정보가 궁금할때 **

$ docker volume inspect [volume name]

container끼리 ssh 통신할때 필요한 IP를 알기위한 방법~(IP 알아내기)

$ docker inspect [containername]

부팅시 docker 시작하게 만들기 (우분투)

sudo nano /etc/systemd/system/docker-name.service
sudo nano /etc/systemd/system/[name].service

수정할때 아래와같이 입력한다 docker name만 지정

[Unit]
Wants=docker.service
After=docker.service

[Service]
RemainAfterExit=yes
ExecStart=/usr/bin/docker start docker-name
ExecStop=/usr/bin/docker stop docker-name

[Install]
WantedBy=multi-user.target

start 뒤에 docker에서 설정한 이름을 지정하면된다.

 

sudo systemctl enable docker-name.service

 

 

docker의 이론을 이해하고 사용하기에 가장 잘 설명되있는 사이트 :

www.44bits.io/ko/post/how-docker-image-work#%EB%8F%84%EC%BB%A4-%EC%BB%A4%EB%B0%8B%EC%9C%BC%EB%A1%9C-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%A7%8C%EB%93%A4%EA%B8%B0-dockerfile%EB%A1%9C-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%A7%8C%EB%93%A4%EA%B8%B0

docker - compose 사용법

https://docs.docker.com/compose/gettingstarted/

 

이외 출처 :

https://deogicorgi.tistory.com/7

 

'DataEnginner > Docker' 카테고리의 다른 글

docker 에서 jupyter notebook 한글 깨짐  (0) 2021.11.10
Docker container / DB연결  (3) 2021.07.08
Docker-compose  (0) 2021.06.16