코딩마을방범대

우분투에서 Docker 사용하기 본문

💡 백엔드/우분투

우분투에서 Docker 사용하기

신짱구 5세 2023. 9. 4. 13:57
728x90

 

 

이전포스트 참고하여 Docker가 뭔지 알아봤고, 우분투에 Docker를 설치하여 사용 예정이다.

https://sweet-rain-kim.tistory.com/146

 

컨테이너와 Docker란?

컨테이너(Container)란? 애플리케이션을 환경에 구애받지 않고 실행하는 기술이다. 운영체제에서 실행되는 프로세스를 격리하여 별도의 실행 환경을 제공해주며, 해당 프로세스는 운영체제 상에

sweet-rain-kim.tistory.com

 

 

 

 


 

 

 

 

 

Docker 설치

 

 

1. 우분투 시스템 패키지 업데이트

$ sudo apt-get update

 

 


 

 

 

2. 필요한 패키지들 설치

$ sudo apt-get install \
	ca-certificates \
	curl \
	gnupg \
	apt-transport-https \
	software-properties-common \
	lsb-release
ca-certificates certificate authority에서 발행되는 디지털 서명
SSL 인증서의 PEM 파일이 포함되어 있어 SSL 기반 앱이 SSL 연결이 되어있는지 확인할 수 있음
curl 특정 웹사이트에서 데이터를 다운로드 받을 때 사용
gnupg (GNU Privacy Cuard) 배포 파일의 인증을 확인하는데 사용되는 자유 소프트웨어 패키지
apt-transport-https 패키지 관리자가 https를 통해 데이터 및 패키지에 접근할 수 있도록 함
software-properties-common *PPA를 추가하거나 제거할 때 사용
lsb-release
특정 LSB(Linux Standard Base)의 정보를 제공
PPA (Personal Package Archive)
- 개인 패키지 저장소
- 개발자가 소스코드를 업로드하면 자동으로 패키지화함
- 사용자가 다운로드 받아 설치할 수 있게 해주는 소프트웨어 저장소

 

 


 

 

 

3. curl을 이용한 패키지 설치 및 Docker의 공식 GPG키를 추가

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# or
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
f HTTP 요청 헤더의 contentType을 multipart/form-data로 보냄
s 진행 과정이나 에러 정보를 보여주지 않음(--silent)
S SSL 인증과 관련
L 서버에서 301, 302 응답이 오면 redirection URL을 호출
apt-key apt가 패키지를 인증할 때 사용하는 키 리스트를 관리한다.
이 키를 사용해 인증된 패키지는 신뢰할 수 있는 것으로 간주하며,
add 명령어는 키 리스트에 새로운 키를 추가하겠다는 의미이다.
dearmor
PGP 키를 GPG 파일 형식으로 변환하기 위해 사용
o 파일 출력

 

 


 

 

 

4. Docker의 안정된 공식 apt 저장소를 추가

$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# or
$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
deb 실행 파일, 문서 및 라이브러리를 구성하는 두 개의 TAR 아카이브로 구성되어 있는 데비안 소프트웨어 패키지 파일
(dpkg는 데비안 패키지 관리 소프트웨어)
add-apt-repository PPA(Personal Package Archive) 저장소를 추가해준다. 
apt 리스트에 패키지를 다운로드 받을 수 있는 경로가 추가된다.
dpkg --print-architecture
아키텍처 확인
signed-by GPG 키 경로를 받음
tee
표준 입력(standard input)에서 읽어서 표준 출력(standard output) 과 파일에 쓰는 명령어

-a(--append)                      : 파일을 덮어쓰지 않고 지정된 파일에 추가
-i(--ignore-interrupts)       : 인터럽트 신호를 무시

 

 


 

 

5. 우분투 시스템 패키지 업데이트

$ sudo apt-get update

 

 


 

 

6. Docker 설치

$ sudo apt-get install docker-ce docker-ce-cli containerd.io

 

 


 

 

7. Docker 설치 확인

$ sudo docker version
# or
$ sudo systemctl status docker
systemctl
리눅스에서 서비스를 등록, 삭제(mask, unmask) / 활성화, 비활성화(enable, disable) / 시작, 중지, 재시작(start, stop, restart) / 상태 확인(status) / 서비스 확인(list-units, list-unit-files)을 할 수 있는 명령어

 

 

 


 

 

💡 sudo 없이 docker 사용하는 방법

 

$ sudo usermod -aG docker 유저명

 

 

 

 

 


 

 

 

 

 

 

Docker Image 검색 및 설치

<>는 필수, []는 선택

 

 

 도커 허브에서 image 검색

$ docker search [옵션] <검색어>
옵션 설명
-f (--filter) 제공된 조건에 따라 출력 필터링
--format
Go 템플릿을 사용한 검색
--limit
최대 검색 결과 수(기본값 25)
--no-trunc
출력을 자르지 않음

 

 


 

 

 도커 허브를 통해 image 다운

$ docker pull [옵션] <이미지명>[:태그명]
옵션 인수 설명
-a (--all-tags) boolean 태그가 지정된 모든 이미지 다운로드
--disable-content-trust boolean
이미지 확인 건너뛰기 (기본값 true)
--platform  
서버가 멀티 플랫폼을 지원하는 경우 플랫폼 설정
-q (--quiet) boolean
상세 출력 제어

 

 


 

 

 설치된 image list 확인

$ sudo docker images

 

 


 

 

 image 삭제하기

$ docker rmi 이미지이름:이미지태그
# or 전체 삭제
$ docker rmi $(docker images -q)

 

 


 

 

 image를 tar 파일로 저장하기

$ sudo docker save -o <저장할 파일명.tar> <이미지명>:<태그명>

 

 


 

 

tar 파일을 image로 불러오기

$ sudo docker load -i 파일명.tar
옵션 설명
 -i (--input) STDIN(Standard Input, 표준 입력에서 데이터를 읽어옴) 대신 tar 아카이브 파일에서 읽기
-q (--quiet) 상세 출력 제어

 

 

 

 

 

 


 

 

 

 

 

 

Docker Image 를 이용해 컨테이너 생성 및 실행

 

 

■ 이미지를 이용해 컨테이너 생성

 

주로 --name 옵션을 많이 사용한다.

( --name 옵션을 지정해주지 않으면 컨테이너 이름이 자동으로 생성된다 )

$ docker create [옵션] <이미지명>

 

 


 

 

 생성된 컨테이너 실행

$ docker start [옵션] <컨테이너ID>
옵션 인수 설명
-a (--attach ) boolean STDOUT/STDERR을 부착하고 신호를 전달
--detach-keys
 
컨테이너 분리를 위한 키 시퀀스 재정의
-i (--interactive) boolean 상호 입출력 (표준 입력에 대한 포인터인 STDIN(Standard Input)을 사용하지 않아도 열어둠)

 

 

 


 

 

 컨테이너 중지

$ docker stop <컨테이너ID>
# or 모두 종료
$ docker stop $(docker ps -a -q)

 

 

 


 

 

 컨테이너 접속

$ docker attach [옵션] <컨테이너ID>
옵션 인수 설명
--detach-keys
 
컨테이너 분리를 위한 키 시퀀스 재정의
--no-stdin boolean no stdin(Standard Input), 표준 입력에서 데이터를 읽어오지 않음
--sig-proxy
boolean
수신된 모든 신호를 프로세스에 프록시(기본값 true)

 

 


 

 

 컨테이너 재부팅

$ docker restart <컨테이너ID>

 

 


 

 

 컨테이너 삭제

$ docker rm <컨테이너ID>
# or 전체 삭제
$ docker rm $(docker ps -a -q)

 

 


 

 

실행 중인 컨테이너 확인

$ docker ps -a

 

 


 

 

 실행 중인 컨테이너 설정 업데이트

$ docker update [OPTIONS] <컨테이너ID>
옵션 인수 설명
--restart 아래 run 옵션 참고 컨테이너가 종료될 때 적용할 다시 시작 정책
--memory int 메모리 한도 (기본값: 0)

 


 

 

💡 pull ~ create ~ start ~ attach 를 한번에

 

$ docker run [옵션] <이미지명> [명령어] [인자...]
# 명령어 exit 을 이용해 빠져나옴

#예시
$ sudo docker run -p 8080:8080 \
	--name db-service \
	--hostname db-service \
	--link ldap-service:ldap-host \ 
	-en MYSQL_ROOT_PASSWORD=mariadb \
	--volume /home/dbkim/freeradius/clients.conf:/etc/freeradius/clients.conf \
	--detach mariadb:10.5.12
옵션 인수 설명
-d (--detach)   백그라운드, 데몬 모드 (detached mode)
-p [HOST_PORT]:[CONTAINER_PORT] 호스트PC와 컨테이너의 포트를 연결 (포워딩)
-v (--volume) [HOST_PATH]:[DOCKER_PATH] 호스트와 컨테이너의 디렉토리를 연결 (마운트)
-e (--env) [VARIABLE_NAME]=[VALUE] 컨테이너 내에서 사용할 환경변수 설정
--name [CONTAINER_NAME] 컨테이너 이름 설정
--hostname [CONTAINER_NAME] 컨테이너 이름
--rm   프로세스 종료시 컨테이너 자동 제거
-i   상호 입출력 (표준 입력에 대한 포인터인 STDIN(Standard Input)을 사용하지 않아도 열어둠)
-t   tty를 활성화하여 bash 쉘을 사용
--link [CONTAINER_NAME]:[OTHER_CONTAIER_NAME] 컨테이너 연결
-it   -i, -t를 합친 것으로, 터미널 접속 가능
--restart   no : 재시작하지 않음 (기본값) 
on-failure : 에러로 인해 종료될 시 재시작
always : docker가 종료 후 시작될 때 항상 재시작
unless-stopped : 컨테이너가 종료되지 않는다면 항상 재시작, 종료되었다면 직접 시작하기 전까지는 Docker가 재시작돼도 컨테이너는 재시작되지 않음
docker run과 docker exec의 차이
docker run     : 컨테이너를 생성하고 실행할 때 사용
docker exec   : 이미 실행된 특정 컨테이너의 환경을 디버깅하는 용도로 사용

exec 예시 1)
test-container에서 ps 명령어 수행

$ docker exec test-container ps

exec 예시 2)
test-container라는 컨테이너에 접속하여 명령어 수행 가능(it 옵션을 통해 상호 작용 가능)

$ docker exec -it test-container bash
bash-5.0# ls

 

 

 

 

 

 

 


 

 

 

 

 

 

서버 재부팅 시 도커 컨테이너가 자동으로 실행되게 만들기

 

 

1. 쉘 파일 만들기

$ vi 파일명.sh
#!/bin/bash
docker run <이미지명>

 

 


 

 

2. 쉘 파일 권한 변경

$ sudo chmod 파일명.sh

 

 


 

 

3. 실행 제어 설정 파일 편집

$ sudo vi /etc/rc.d/rc.local
<쉘파일 경로>
# ex) /home/mh-dev/docker_reboot_auto.sh

 

 


 

 

4. 파일 권한 부여

$ sudo chmod +x /etc/rc.d/rc.local

 

 


 

 

5. 자동 실행 등록

$ systemctl enable rc-local
$ systemctl start rc-local
$ systemctl status rc-local

 

 


 

 

💡 자동 시작되는 서비스 리스트 출력

 

$ systemctl list-unit-files --type service | grep enabled
자동 실행 비활성화
: systemctl disable 서비스명

자동 실행 활성화
: systemctl enable 서비스명

서비스 시작 상태확인
: systemctl list-unit --type service -a | grep -w inactive

 

 

 

 

 

 


 

 

 

 

Docker cp

 

docker image를 실행시킨 컨테이너는 HOST와 다른 PC인 것이나 마찬가지이다. 

docker는 HOST와 PC간의 파일 이동을 위해 복사 명령어인 cp를 지원한다.

 

옵션 설명
-a (--archive)
보관 모드(모든 uid/gid 정보 복사)
-L (--follow-link) SRC_PATH에서 항상 기호 링크를 따릅니다(?)
-q (--quiet) 진행률 출력 X

 

 

 

1. 호스트 -> 컨테이너

$ docker cp [host 파일경로] [container name]:[container 내부 경로]

# 예시
$ docker cp /home/dbkim/test.txt test-container:/test

 


 

 

2. 컨테이너 -> 호스트

$ docker cp [container name]:[container 내부 경로] [host 파일경로]

# 예시
$ docker cp test-container:/test/test.txt /home/dbkim/test

 

 

 

 

 

 


 

 

 

 

💡 TIPS! 

 

 

 Docker 데이터 저장 위치 확인

$ sudo docker info | grep Root

 


 

 

 Docker 데이터 저장 위치 변경

$ sudo vi /lib/systemd/system/docker.service

 

ExecStart 줄의 맨 뒤에 --data-root=변경할 경로 추가 

(--data-root가 없다면 기본 경로인 /var/lib/docker 에 저장된다.)

 

위 설정대로 변경해준 뒤 Docker 재실행 후 확인

$ systemctl daemon-reload
$ systemctl stop docker
$ systemctl start docker
$ sudo docker info | grep Root

 

 

 

 

 


참고사이트

Ubuntu 에 Docker 설치

[도커 스터디#2] 개발환경 세팅 및 배포 실습

서버 재부팅 시 도커 컨테이너가 자동으로 실행되게 만들기

docker cp - 호스트 컨테이너 사이 파일 복사

 

 

728x90