코딩마을방범대
우분투에서 Docker 사용하기 본문
이전포스트 참고하여 Docker가 뭔지 알아봤고, 우분투에 Docker를 설치하여 사용 예정이다.
https://sweet-rain-kim.tistory.com/146
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
참고사이트
서버 재부팅 시 도커 컨테이너가 자동으로 실행되게 만들기
'💡 백엔드 > 우분투' 카테고리의 다른 글
Docker 내에서 Docker 사용하기 (0) | 2023.09.07 |
---|---|
Docker 이미지 생성하기 (0) | 2023.09.05 |
우분투에서 Apache를 이용해 WAS 연동하기 (0) | 2023.06.13 |
우분투 패키지 재설치 시 정상적으로 설치가 되지 않을 경우 (0) | 2023.06.12 |
우분투에서 Nginx 구축 (0) | 2023.06.12 |