이 게시글은 Mac OS M1 으로 공부합니다.
1장. 도커란 ?
1.3 도커 엔진 설치
2017년 3월부터 도커 엔진은 도커 EE (Docker Enterprise Edition) 와 도커 CE (Community Edition) 으로 구분되어 제공되고 있으며, 버전 이름 또한 17.03-EE 또는 17.03-CE 와 같이 (출시 년도) - (출시 월) = (도커 엔진 종류) 의 형태로 변경되었습니다.
도커 EE 는 유료로 제공되는 기업용 솔루션이며, 도커 CE 는 무료로 제공되는 도커 엔진입니다.
1.3.4 리눅스 환경에 도커 마련하기
- 가상머신 설치하기
brew install virtualbox
M1 은 virtualbox 를 사용할 수 없는 듯 하다.
이 경우 무료로 사용 가능하고 arm64 아키텍쳐를 지원하는 UTM 을 사용하면 된다.
이 방법 외에도 도커에서 이미지를 pull 받아 사용하는 방법도 있다.
brew install utm
- 리눅스 ISO 파일받기
https://ubuntu.com/download/server/arm
가상머신에서 사용할 리눅스 배포판을 LTS 버전으로 다운로드 ISO 파일을 받는다.
ISO 보다 UTM 이 더 오래 걸립니다.
- UTM 에 ISO 등록
- 새 가상머신 만들기
- Virtualize 클릭
- Lunix 클릭
- 다운로드 받은 ubuntu 이미지 (ISO) 를 선택
- 메모리와 하드디스크 용량 선택 (메모리는 보통 2048MB, 하드디스크는 50GB)
- 공유폴더는 설정하지 않아도 됨
설치가 끝났으면 Linux
- 우클릭 - Edit
- USB Drive - delete drive 로 설치드라이브를 삭제
- 재부팅
아이디: connor
비밀번호: 1129
로 로그인을 해보면
잘 로그인이 된 것 같다.
- 리눅스에 도커 설치하기
1.3.2 리눅스 도커 엔진 설치의 내용입니다.
확인해야 할 사항
- 커널 (호스트 운영체제) 이 최소한 3.10 버전 이상
- 지원기간 내에있는 배포판
- 64비트 릴눅스
- sudo 명령어를 통해 설치하거나 root 권한 소유자 계정에서 설치
- 커널 확인
uname -r
도커엔진 메뉴얼
https://docs.docker.com/engine/install/ubuntu/
Ubuntu 에 도커엔진을 설치 vs Linux 용 도커 데스크탑
책에서는 도커엔진을 사용하므로 이를 적용하자.
세 가지 설치방법이 있다.
- Docker 리포지토리 설정 후 설치 (권장)
- DEB 패키지 다운로드하여 수동 설치
- 편의 스크립트 설치
우리는 권장된 1번 방법으로 도커엔진을 설치해봅시다.
- 패키지 인덱스 업데이트 후 apt 패키지 설치
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
꼭 Shift Enter 로 새 줄로 작성한다. 새 줄을 작성하지 않으려면 \ 을 빼야하는 듯 하다.
sudo apt-get update 를 입력했을 때 다음과 같은 에러가 나온다면
E: Malformed entry 1 in list file /etc/apt/sources.list.d/ros-latest.list ([option] not assignment)
E: The list of sources could not be read.
다음과 같은 명령어로 삭제 후 명령어를 재 실행 한다.
sudo rm /etc/apt/sources.list.d/ros-lates.list
- 도커의 공식 GPG 키 추가
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
- 리포지토리 설정
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
- 도커엔진 설치
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
특정 버전을 설치할 수도 있다.
- 도커엔진이 잘 설치됐는지 확인해보자.
sudo docker run hello-world
2장. 도커 엔진
2.1 도커 이미지와 컨테이너
도커엔진에서 사용하는 기본 단위는 이미지와 컨테이너입니다.
2.1.1 도커 이미지
이미지는 컨테이너를 생성할 때 필요한 요소이며, 가상머신을 생성할 때 사용하는 iso 파일과 비슷한 개념입니다.
컨테이너를 실행할 때 읽기 전용으로 사용됩니다.
이미지는 도커 명령어로 내려받을 수 있으므로 별도로 설치할 필요는 없습니다.
도커에서 사용하는 이미지의 이름은 기본적으로 [저장소 이름[/[이미지 이름]:[태그]
의 형태로 구성됩니다.
예시) alicek106/ubuntu:14.04 또는 ubuntu:latest
2.2 도커 컨테이너 다루기
2.2.1 컨테이너 생성
docker -v
도커엔진의 버전을 확인합니다.
책은 20.10.5 (2021년 기준) 이고 저는 20.10.17 (2022년 6월) 버전이네요.
docker run
컨테이너를 생성하고 실행합니다.
docker run -i -t ubuntu:14.04
ubuntu:14.04
컨테이너를 생성하기 위한 이미지의 이름-i
-t
컨테이너와 상호 (interactive) 입출력을 가능하게 한다.
이미지가 로컬에 존재하지 않으므로 도커허브에서 자동으로 이미지를 내려받습니다.
쉘의 사용자와 호스트이름이 변경된 것이 컨테이너 내부에 들어와 있다는 것을 나타냅니다.
기본사용자는 root, 호스트 이름은 무작위의 16진수 해시값입니다.
다음과 같은 문제가 발생한다면
Got permission denied while trying to connect to the Docker daemon socket
id 명령어를 입력해봅니다.
다음 명령어를 입력하고
sudo usermod -a -G docker $USER
reboot
명령어로 재부팅합니다.
다시 id
명령어로 권한을 입력해보면
도커가 추가된 것을 볼 수 있습니다.
-i
상호 입출력-t
tty 를 활성화해서 bash 쉘을 사용하도록 컨테이너를 설정했습니다.
docker run 명령어에서 이 두 옵션 중 하나라도 사용하지 않으면 쉘을 정상적으로 사용할 수 없습니다.
컨테이너 내부에서 빠져나오는 방법은
- 컨테이너 쉘에서
exit
를 입력 - Ctrl D 입력 -> 위 두 방법은 컨테이너를 빠져나오면서 컨테이너를 정지시킵니다.
- Ctrl (Control) P, Q -> 컨테이너를 정지하지 않고 빠져나오기 때문에 컨테이너 애플리케이션을 개발하는 목적으로 컨테이너를 사용할 때 사용합니다.
우리는 exit
명령어를 사용합니다.
docker pull
이미지를 내려받는다.
docker pull centos:7
docker images
도커엔진에 존재하는 이미지의 목록을 출력
컨테이너를 생성할 때는 run
명령어가 아닌 create
명령어를 사용할 수도 있습니다.
docker create -i -t --name mycentos centos:7
--name
컨테이너의 이름 설정docker inspect
컨테이너의 ID 확인docker create
run 과 달리 컨테이너 내부로 들어가지 않습니다.
docker start
컨테이너를 시작한다.docker attach
컨테이너 내부로 들어간다.
run VS create
run
pull (이미지가 없을 때) -> create -> start -> attach (-i, -t 옵션을 사용했을 때)create
pull -> create
보통은 컨테이너를 생성함과 동시에 시작하기 때문에 run
명령어를 더 많이 사용합니다.
컨테이너를 대상으로 하는 모든 명령어는 컨테이너의 이름 대신 ID 를 쓸 수 있습니다.
docker ps
컨테이너의 목록을 확인
정지되지 않은 컨테이너만 출력합니다.exit
을 사용해 빠져나온 컨테이너는 정지상태이기 때문에 출력되지 않지만
Control + P, Q 입력해 빠져나온 컨테이너는 실행 중이기 때문에 컨테이너 목록에 출력됩니다.
정지된 컨테이너를 포함한 모든 컨테이너를 출력하려면 -a
옵션을 추가합니다.
container id
docker inspect 명령어로 전체 ID 를 확인할 수 있다.image
컨테이너를 생성할 때 사용된 이미지 이름command
컨테이너가 시작될 때 실행될 명령어.
이미지에 내장된 커맨드는 docker run
이나 create
명령어의 맨 끝에 입력해서 컨테이너를 생성할 때 덮어쓸 수 있습니다.
아래의 컨테이너는 실행될 때 마다 "echo hello world!"
를 실행합니다.
docker run -i -t ubuntu:14.04 echo hello world!
그러나 내장된 커맨드인 /bin/bash 를 덮어쓰기 때문에 상호 입출력이 가능한 쉘이 실행되지 않아 hello world! 라는 내용만 출력되고 컨테이너가 종료됩니다.
created
컨테이너가 생성되고 난 뒤 흐른 시간status
컨테이너의 상태. Up, Exited, Pause 등이 있다.ports
컨테이너가 개방한 포트와 호스트에 연결한 포트를 나열합니다. 컨테이너를 생성할 때는 외부에 노출하도록 설정하지 않았으므로 아무것도 출력되지 않습니다.names
컨테이너의 고유한 이름. docker rename 명령어로 컨테이너의 이름을 변경할 수 있습니다.
docker rename 현재이름 새이름
docker ps --format "table {{.ID}}\t{{.Status}}\t{{.Image}}"
Names
ID, Status, Image 등 대소문자를 구분해야 된다.
2.2.3 컨테이너 삭제
docker rm
컨테이너를 삭제 (docker remove)
삭제한 컨테이너는 복구할 수 없습니다.docker ps -a
명령어로 삭제가 되었는지 확인합니다.
실행중인 컨테이너는 삭제할 수 없습니다.
docker stop
컨테이너를 정지docker rm -f 컨테이너이름
컨테이너를 강제로 삭제
docker container prune
정지된 모든 컨테이너 삭제
docker ps 의 옵션
-a
컨테이너의 상태와 관계없이 출력-q
컨테이너의 ID 만 출력
다음 명령어는 실행상태와 관계없이 모든 컨테이너를 정지하고 삭제합니다.
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
docker rm $(docker ps -a -q) 명령어는
docker container prune
명령어와 같다.
2.2.4 컨테이너를 외부에 노출
컨테이너는 가상머신과 마찬가지로 가상 IP 주소를 할당받습니다.
기본적으로 도커는 컨테이너에 172.17.0.x 의 IP 를 순차적으로 할당합니다.ifconfig
로 컨테이너의 네트워크 인터페이스를 확인합니다.
ifconfig: command not found 에러가 뜬다면 해당 리눅스에 net-tools 패키지가 없어서 그렇습니다.
도커의 NAT IP 인 172.17.0.2 를 할당받은 eth0 인터페이스와 로컬호스트인 lo 인터페이스가 있습니다.
아무런 설정을 하지 않았다면 이 컨테이너는 외부에서 접근할 수 없으며 도커가 설치된 호스트에서만 접근할 수 있습니다.
Docker Desktop for Mac 에서는 호스트에서 컨테이너 IP 로의 접근이 불가능합니다.
외부에 컨테이너 애플리케이션을 노출하기 위해서는 eth0 의 IP 와 포트를 호스트의 IP 와 포트에 바인딩해야 합니다.
컨테이너에서 호스트로 빠져나온 뒤 다음 명령어를 입력해 컨테이너를 생성합니다. 이 컨테이너에 아파치 웹 서버를 설치해 외부에 노출할 것입니다.
docker run -i -t --name mywebserver -p 80:80 ubuntu:14.04
이전에 run 예제와 다른 점은 -p 옵션을 추가한 것입니다. -p 옵션은 컨테이너의 포트를 호스트의 포트와 바인딩해 연결할 수 있게 설정합니다.
-p 옵션의 입력형식은 다음과 같습니다.-p 호스트의포트:컨테이너의포트
호스트의 특정 IP 를 사용한다면
192.168.0.100:7777:80
과 같이 바인딩할 IP 와 포트를 명시합니다.
또한 여러 개의 포트를 외부에 개방하려면 -p 옵션을 여러 번 써서 설정합니다.
docker run -i -t -p 3306:3306 -p 192.168.0.100:7777:80 ubuntu:14.04
아파치 웹 서버는 기본적으로 80번 포트를 사용하므로 여기서는 컨테이너의 80번 포트를 호스트와 연결합니다.
-p 80
와 같이 입력하면 컨테이너의 80번 포트를 호스트의 포트 중 하나와 연결하지만docker ps
를 통해 PORTS 를 확인해야 합니다.
컨테이너를 생성해 내부로 들어왔으므로 웹 서버를 설치해보자.
- 아파치 웹 서버 설치
apt-get update
apt-get install apache2 -y
service apache2 start
다음과 같은 에러가 나온다면
could not reliably determine the server's fully qualified domain name, using 172.17.0.2. set the 'servername'
다음과 같이 서버이름을 설정해주면 된다.
echo "ServerName localhost" >> /etc/apache2/apache2.conf
grep ServerName /etc/apache2/apache2.conf
서버를 재시작해주자.
service apache2 restart
이제 웹 브라우저에서 아이피:80 으로 접근해본다.
- 맥에서 아이피를 확인
ifconfig | grep inet
grep
입력으로 전달된 파일에서 특정 문자열을 찾을 때 사용하는 명령어
ifconfig 파일에서 inet 문자열을 찾는다.
2.2.5 컨테이너 애플리케이션 구축
이번에는 데이터베이스와 워드프레스 웹 서버 컨테이너를 연동해 워드프레스 기반 블로그 서비스를 만들어 봅시다.
다음 명령어를 입력해 각 컨테이너를 생성합니다.
docker run -d \
--name wordpressdb \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_DATABASE=wordpress \
mysql:5.7
웹 서버 컨테이너도 만들어보자.
docker run -d \
-e WORDPRESS_DB_HOST=mysql \
-e WORDPRESS_DB_USER=root \
-e WORDPRESS_DB_PASSWORD=password \
--name wordpress \
--link wordpressdb:mysql \
-p 80:80 \
wordpress
docker port wordpress
컨테이너의 호스트와 바인딩된 포트만 확인
0.0.0.0:32769 -> 80/tcp 는 호스트의 활용 가능한 모든 네트워크 인터페이스에 바인딩함을 뜻합니다.
docker: no matching manifest for linux/arm64/v8 in the manifest list entries.
M1 에서 다음과 같은 에러가 날 경우
마리아 DB 로 하자.
docker run -d \
--name wordpressdb \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_DATABASE=wordpress \
mariadb:10.5.8
docker run -d \
-e WORDPRESS_DB_HOST=mariadb \
-e WORDPRESS_DB_USER=root \
-e WORDPRESS_DB_PASSWORD=password \
--name wordpress \
--link wordpressdb:mariadb \
-p 80 \
wordpress
'Stacks > 데브옵스' 카테고리의 다른 글
시작하세요! 도커 / 쿠버네티스 (0) | 2023.02.05 |
---|