[Docker]간단한 컨테이너 구현 실습-5

이번 글에서는 지난번에 설치한 도커를 사용해서 여러 컨테이너들을 구현하는 실습을 해보겠습니다.

시스템 컨테이너 생성

docker pull centos:7
docker pull ubuntu:16.04
docker images
docker run -it --name=sys-container-1 centos:7 echo 'welcome fastcampus!'
docker ps -a

docker run -it --name=sys-container-2 centos:7 bash
cat /etc/os-release
exit
docker ps
docker ps -a
docker start sys-container-2
docker ps -a
docker exec -it sys-container-2 bash

도커에서 사용하는 명령어들 중에서 이번에 사용 하는 명령어들을 정리하고 가겠습니다.

  • docker pull: 이미지를 다운받는다.
  • docker images: docker image ls와 같이 다운받은 이미지의 목록을 알수 있다.
  • docker run: 이미지를 사용해서 컨테너를 만드는 명령어입니다.
    • -it : 입력을 받겠다는 뜻입니다. 컨테이너 내부에서 키보드를 통해서 입력을 해야할때 사용합니다.
    • –name : 컨테이너의 이름입니다
  • docker ps: 현제 실행하고 있는 컨테이너의 목록을 보여집니다.
    • -a: 모든 컨테이너의 목록을 보여줍니다. 비활성화된 컨테이너도 표시
  • docker start [컨테이너 이름]: 컨테이너를 실행시킨다.
  • docker exec: 활성화된 컨테이너에게 명령어를 실행시킨다.

centos:7, ubuntu:16.04의 이미지를 다운받는다. 7, 16.04는 해당 이미지의 태그(버전)를 의미한다. hub.docker.com에서 해당 버전을 확인 할수 있는데 바로 받기 보다는 사용하고자 하는 이미지의 버전을 확인해서 대도록이면 경량의 이미지(alpine, slim)를 선택하고 사용법을 확인해 보는게 좋다.

docker image ls 혹은 docker images로 다운받은 이미지 목록을 확인할수 있다.

docker run -it –name=sys-container-1 centos:7 echo ‘welcome fastcampus!’ 로 centos 컨테이너를 실행해서 echo ‘welcome fastcampus!’ 를 실행할수있다.

실행을 한후에 docker ps로 확인해보면 실행중인 컨테이너가 없다. -a옵션을 주어서 모든 컨테이너의 목록을 확인해보니 Exited가 되어서 죽은 상태임을 알수있다.

centos:7 echo ‘welcome fastcampus!’ 에서 이미지 다음에 존재하는 echo 부터가 실행 명령어인데 실행하고 바로 해당 컨테이너가 죽는데

docker run -it –name=sys-container-2 centos:7 bash 처럼 bash를 사용하면 centos 컨테이너 내부로 들어간다.

centos에 들어왔는지 os정보를 확인 하는 명령어는 cat /etc/os-release다.

여기서 해당 컨테이너에서 나가는 방법으로 exit를 입력하면된다.

exit를 입력하면 설정에 따라 다르지만 컨테이너가 exited되서 죽을수도 있고 안 죽을수도있다. 그래서 추천하는 컨테이너 나가는 방법은 ctrl p q를 사용하는 거다.

컨트롤을 누른체로 차례대로 p, q를 눌러 나가면 exited가 되지 않아 컨테이너 죽는 경우가 발생하지 않는다.

exit를 눌러서 컨테이너가 죽은 경우 혹은 재부팅등의 경우로 컨테이너가 죽었을때는 docker start [컨테이너 이름]로 활성화시킨 후에
docker exec -it [컨테이너 이름] bash으로 접근할수있다.

 


웹서버, Nginx

docker pull nginx:1.25.0-alpine
docker image history nginx:1.25.0-alpine

docker run -d -p 8001:80 --name=my-webserver1 nginx:1.25.0-alpine

docker ps | grep my-webserver1
docker port my-webserver1

curl localhost:8001

nginx버전중에서 alpine이 붙어있는 걸로 고릅니다. 이게 최소용량의 이미지입니다.

docker run 명령어로 컨테이너를 만들어 뛰워야 하는데 어떤 옵션을 적용 해야 하는지 확인을 해야합니다. 가장 추천하는 거는 hub.docker.com에서 해당 이미지의 사용법을 확인 하는게 가장 좋습니다. docker image history nginx:1.25.0-alpine 이 처럼 명령어를 사용해서 간단하게 확인 할수도 있습니다.

80 포트를 사용한다고 하네요.

docker run -d -p 8001:80 –name=my-webserver1 nginx:1.25.0-alpine

  • -d: 데몬 옵션입니다. 백그라운드에서 실행하겠다는 의미입니다
  • -p: 호스트의 포트와 컨테이너의 포트를 포트포워딩 하는 옵션입니다. 호스트의 8001이 컨테이너의 80번으로 연결됩니다.
  • –name: 컨테이너의 이름을 정합니다

docker port my-webserver1
my-webserver1가 어떻게 네트워크가 연결된지 확인 할수 있습니다.

특정 포트가 어떻게 컨테이너와 연결이 되는지 확인 할수도 있습니다.

서버의 동작은 curl localhost:3001번으로 서버를 확인하거나 192.168.68.101:8001으로 확인 가능합니다.

https://github.com/hylee-kevin/fastcampus
위의 주소에서 ch02의 index_html_sample1을 복사합니다. 아래에서 깃을 다운받아서 사용할거지만 여기서는 이부분만 가져와서 사용해볼게요.

vi index.html
# 복사한 내용을 붙여넣습니다 그리고 저장
docker cp index-image.html my-webserver1:/usr/share/nginx/html/index.html

복사한 내용을 컨테이너의 index.html과 교체 했습니다.

브라우저에 실제로 뛰어 보았습니다.  작 적용이 되었네요.

이제 이미지를 배경으로 적용한 파일을 배포해보겠습니다.

mkdir LABs && cd $_

위의 깃헙에서 소스를 호스트에 받은다음에 필요한 파일을 옮겼습니다.

docker cp index_html_sample2.txt my-webserver1:/usr/share/nginx/html/index.html
docker cp docker_logo.png my-webserver1:/usr/share/nginx/html/docker_logo.png

 

이렇게 웹서버를 하나 뛰우고 소스들을 수정해서 하나의 서버를 만들었습니다. 이걸 그대로 이미지로 만들어서 제공 할려는 수요가 생기죠?
그 방법들을 알아봅시다.

# 앞서 수행한 실습의 웹 소스(index.html & docker_logo.png)를 보유한 이미지를 만들고 싶다면?
vi Dockerfile
FROM nginx:1.25.0-alpine
COPY index_html_sample2.txt /usr/share/nginx/html/index.html 
COPY docker_logo.png /usr/share/nginx/html/docker_logo.png EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

docker build -t myweb:v1.0 .
docker run -d -p 8002:80 --name=my-webserver2 myweb:v1.0

도커파일을 만든후
FROM nginx:1.25.0-alpine
COPY index_html_sample2.txt /usr/share/nginx/html/index.html
COPY docker_logo.png /usr/share/nginx/html/docker_logo.png
EXPOSE 80
CMD [“nginx”, “-g”, “daemon off;”]

복붙해서 저장합니다.
이 도커 파일로 docker build -t myweb:v1.0 .  실행해서 이미지를 만들수 있습니다. docker images로 잘 만들어졌는지 확인해볼수 있습니다.

docker run -d -p 8002:80 –name=my-webserver2 myweb:v1.0
8082번으로 뛰었습니다.

 

이걸 깃에서 소스를 받은후에 그걸로 이미지를 만들고 뛰우는 실습을 해보겠습니다.

cd ~
git clone https://github.com/hylee-kevin/fastcampus.git
cd fastcampus/ch02/

mv index_html_sample2.txt index-image.html
docker build -t myweb:v1.1 .
docker run -d -p 8003:80 --name=my-webserver3 myweb:v1.1

nginx 실습이 끝났어요.


데이터베이스 컨테이너 생성

mysql, mariadb를 설치하고 사용하는 실습을 하겠습니다.

mysql

강의와 같이 mysql:5.7-devian을 다운받을려고 했지만 맥 실리콘과 호환이 되지 않는다고 합니다. hub.docker.com에 mysql문서를 읽어보니 호환 되는 버전들이 있습니다. 그중에서 arm64v8/mysql:8.1.0을 다운받았습니다.

docker pull arm64v8/mysql:8.1.0
docker run --name mysql -it -e MYSQL_ROOT_PASSWORD=pass123# arm64v8/mysql:8.1.0 /bin/bash
mysql –uroot -p

간단하게 데이터 베이스가 잘 작동하는지 테스트 해보겠습니다

show databases;
create database fastcampus;
show databases;
use fastcampus;
create table t1(a int, b varchar(10));
insert into t1 values(10, 'fastcampus');
select * from t1;

mariaDB

docker run --name mariadb -e MYSQL_ROOT_PASSWORD=mkevin -d -e MARIADB_DATABASE=item -p 3306:3306 mariadb:10.2

위처럼 설치하면 바로 위의 mysql실습과 동일하게 사용가능합니다. 강의에서 mysql 워크벤치를 사용해서 툴로 사용 하는 방법을 다룹니다. 저는 디비버를 사용해서 진행했습니다. 디비버는 커뮤니티 버전을 설치해서 진행하면 됩니다. 맥, 윈도우를 둘다 지원하고 다른 db들을 지원해서 이걸로 사용합니다.

server host에 우분투 주소를 적습니다. 저는 192.168.68.101입니다

password는 mkevin 입니다

CREATE TABLE Projects (id int(11) NOT NULL, name varchar(255) DEFAULT NULL, code varchar(255) DEFAULT NULL, PRIMARY KEY (id));
insert into Projects (id, name, code) values (1,'DevOps','DO180');
select * from Projects;

이번 실습은 다른 글보다 조금 내용이 많았네요.

다음글에서 봐요.

Leave A Reply

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다