Docker(docker,docker-compose) - 실습을 통한 정리

양승현·2022년 8월 23일
1

docker

목록 보기
5/12

1. CentOS7 iso 를 이용하여 아래와 같이 2대의 서버를 구축한다

[확인내용]

▶ docker01

  • docker01 네트워크 설정
[root@docker01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens32 

  • 디스크 파티션
[root@docker01 ~]# fdisk -l

▶ docker02

  • docker02 네트워크 설정
[root@docker02 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens32 

  • 디스크 파티션
[root@docker02 ~]# fdisk -l


2. 설치 종료 후 docker01 은 docker-ce, docker-compose 를 docker02 는 docker-ce 를 설치한다. 도커는 최신 버전, compose 는 임의대로 선택한다.

[확인내용]

▶ docker01 - docker 설치

  • yum-utils 설치
[root@docker01 ~]# yum install -y yum-utils
  • yum-config-manager 를 통해서 docker 저장소 설정
[root@docker01 ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  • 최신 버전 도커 엔진 설치
[root@docker01 ~]# yum -y install docker-ce docker-ce-cli containerd.io
  • 도커 시작
[root@docker01 ~]# systemctl start docker
  • 실행중인 도커 확인
[root@docker01 ~]# systemctl status docker
  • Docker 서비스를 운영체제 부팅시 자동 시작하도록 설정
[root@docker01 ~]# sudo systemctl enable docker
  • 도커 버전 확인
[root@docker01 ~]# docker --version

▶ docker01 - docker-compose 설치

  • docker-compose 설치
[root@docker01 ~]# sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  • docker-compose 실행 권한 부여
[root@docker01 ~]# sudo chmod +x /usr/local/bin/docker-compose
  • 설치된 docker-compose 실행 확인
[root@docker01 ~]# docker-compose --version

▶ docker02 - docker 설치

  • yum-utils 설치
[root@docker02 ~]# yum install -y yum-utils
  • yum-config-manager 를 통해서 docker 저장소 설정
[root@docker02 ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  • 최신 버전 도커 엔진 설치
[root@docker02 ~]# yum -y install docker-ce docker-ce-cli containerd.io
  • 도커 시작
[root@docker02 ~]# systemctl start docker
  • 실행중인 도커 확인
[root@docker02 ~]# systemctl status docker
  • Docker 서비스를 운영체제 부팅시 자동 시작하도록 설정
[root@docker02 ~]# sudo systemctl enable docker
  • 도커 버전 확인
[root@docker02 ~]# docker --version


3. 두 서버 모두 방화벽과 SELinux 를 중지시키고 비활성화 한다.

[확인내용]

▶ docker01

  • 방화벽 중지
[root@docker01 ~]# systemctl stop firewalld
[root@docker01 ~]# systemctl disable firewalld
[root@docker01 ~]# systemctl status firewalld

  • SELinux 중지
[root@docker01 ~]# setenforce 0
[root@docker01 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
[root@docker01 ~]# getenforce

▶ docker02

  • 방화벽
[root@docker02 ~]# systemctl stop firewalld
[root@docker02 ~]# systemctl disable firewalld
[root@docker02 ~]# systemctl status firewalld

  • SELinux 중지
[root@docker02 ~]# setenforce 0
[root@docker02 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
[root@docker02 ~]# getenforce

4. user1 계정은 다음의 조건을 만족해야 한다 (docker01,docker02 동일)

    1. sudo 명령을 이용하여 일시적으로 루트권한 획득 가능
    1. sudo 명령 실행시마다 패스워드 요구하지 말아야 함
    1. docker 명령 실행시 sudo 입력 없이 실행 가능해야 함
    1. 모든 docker 명령은 root 가 아닌 user1 으로 실행 해야 함

[확인내용]

▶ docker01, docker02

  • 1/2. user1은 루트 권한 흭득 및 패스워드 요구 x
[root@docker01 ~]# sudo vi /etc/sudoers
 101 user1   ALL=(ALL)       ALL
 111 user1   ALL=(ALL)       NOPASSWD: ALL

  • 3/4. docker 명령 실행시 sudo 입력 x
[root@docker01 ~]# su - user1
[user1@docker01 ~]$ sudo usermod -aG docker user1
[user1@docker01 ~]$ groups user1
  • 3/4. user1으로 docker 명령 가능
[user1@docker01 ~]$ docker container ls

  • ※ 만약 user1으로 docker 명령어를 쳤을 때 아래와 같은 에러문이 나온다면
[user1@docker01 ~]$ docker container ls
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json": dial unix /var/run/docker.sock: connect: permission denied
  • 도커 데몬 소켓에 권한을 부여한다.
[user1@docker01 ~]$ sudo chmod 666 /var/run/docker.sock

5. docker02는 registry 를 이용하여 사설 저장소를 구축하고 web ui 를 통해 확인이 가능해야 함. docker01 에서 사설저장소에 이미지 push 할 때 별도의 인증없이 가능해야 함. 사설 저장소는 서버 재실행시에도 자동 실행되어야 한다

[확인내용]

▶ docker02

  • 컨테이너 배포로 사설 저장소 구축
[user1@docker02 ~]$ docker container run -d -p 5000:5000 --restart=always --name registry -v /home/rapa/registry:/var/lib/registry registry
  • 저장소와 web GUI 연결
[user1@docker02 ~]$ docker run -d -p 8080:8080 --name registry-web --link registry:private -e
REGISTRY_URL=http://211.183.3.202:5000/v2 -e
REGISTRY_NAME=211.183.3.202:5000 --restart=always hyper/docker-registry web

▶ docker01

  • 인증정보 필요 없이 접속할 수 있도록 설정, 보안상 좋지 않다. (서버 IP)
[user1@docker01 ~]$ sudo vi /etc/init.d/docker
[user1@docker01 ~]$ cat /etc/init.d/docker 
DOCKER_OPTS=--insecure-registry 211.183.3.202:5000
  • client에서 server 저장소 ip 설정
[user1@docker01 ~]$ sudo vi /etc/docker/daemon.json
{"insecure-registries":["211.183.3.202:5000"]} 
  • 도커 데몬 재시작
[user1@docker01 ~]$ sudo service docker restart
  • 파일 설정 확인
[user1@docker01 ~]$ docker info
 Insecure Registries:
  211.183.3.202:5000
  127.0.0.0/8
  • 기본 이미지 pull
[user1@docker01 ~]$ docker pull httpd
  • 이미지 형식 변경
[user1@docker01 ~]$ docker tag httpd:latest 211.183.3.202:5000/yang:1.0
  • 이미지 push
[user1@docker01 ~]$ docker push 211.183.3.202:5000/yang:1.0

6. 아래의 단어를 포함하여 도커 컨테이너의 라이프 사이클을 설명하라.

  • 도커 허브/사설저장소/cgroup/namespace/
    로컬저장소/run/pull/push/배포/docker0/create/
    Dockerfile/config.json/
  • [확인내용]

▶ 도커 컨테이너의 라이프 사이클

  • 도커 허브는 불특정 다수가 접속 할 수 있는 공간이며 가입을 통해서 dockerfile을 사용하여 만든 이미지를 build 한 후 이미지를 push하고 저장소에서 pull할 수도 있다. 이미지를 저장소에 올리고 싶다면 docker push를 해주어야 하고 저장소에 저장한 이미지를 가져오고 싶다면 docker pull을 해야한다.
  • 이미지들이 저장 되는 장소는 local registry(로컬 저장소), private registry(사설 저장소), public registry로 나뉜다. 그 중 private registry(사설 저장소)에 접속하기 위해서는 인증 정보가 필요한데 인증 정보는 config.json에 있으며 config.json에 있는 정보를 보고 인증 정보를 확인 받는다.
  • 이 후 컨테이너를 배포할 수 있는데 docker container create 명령을 통해 이미지로부터 컨테이너를 생성만하거나 docker container start 명령을 통해 시작할 수 있다. docker container run 명령을 사용하면 컨테이너를 생성 및 시작할 수 있다.
  • YAML 파일에 작성할때 그 중에서도 network를 정의 할때 만약 네트워크를 정의 하지 않으면 모든 컨테이너들은 bridge 타입의 docker0 네트워크에 연결된다.
  • 도커는 시스템 수준의 가상화로 리눅스 사용 기술인 cgroup과 namespace를 사용하고 있는데, cgroup은 자원 사용 제한 즉 namespace를 통해 구획이 나뉜 각 컨테이너 별로 별도의 자원 사용량을 제공하고, namespace는 프로세스 자원 관리 즉 각각의 컨테이너별로 별도의 작업공간을 제공하여 각 컨테이너 별로 서로간에 영향을 끼치지 않도록 구획을 나누어준다.

7. docker01 은 도커 허브에 로그인시 토큰을 이용해야 한다.

[확인내용]

▶ docker01

  • https://hub.docker.com/ 접속 및 로그인
  • 본인 계정 클릭 후 Account Settings 클릭
  • Security 클릭 후 New Access Token 클릭
  • 토큰을 통한 로그인
[user1@docker01 ~]$ echo "토큰" | docker login --username gnon5367 --password-stdin
[user1@docker01 ~]$ cat ~/.docker/config.json

8. 다음의 조건을 만족하는 이미지를 작성하여 사설 저장소에 push 하라(docker01)

  • 이미지 명 : baseweb:1.0
  • 기본 이미지 : centos:7
  • 컨테이너 배포시 httpd 는 자동으로 동작해야 함
  • ONBUILD 를 이용하여 로컬에 있는 web.tar 를 기본 홈디렉토리에 ADD 한다
  • [확인내용]

▶ docker01

  • 도커 파일 구성
[root@docker01 ~]# vi Dockerfile
[root@docker01 ~]# cat Dockerfile 
FROM centos:7
RUN yum -y install httpd
EXPOSE 80
ONBUILD ADD web.tar /var/www/html/
CMD httpd -D FOREGROUND

  • 이미지 만들기
[root@docker01 ~]# docker build -t 211.183.3.202:5000/baseweb:1.0 .

  • 이미지 올리기
[root@docker01 ~]# docker push 211.183.3.202:5000/baseweb:1.0

9. “8” 에서 만든 이미지를 다시 docker01 에서 다운로드 하여 배포할 때 정상적으로 페이지의 내용을 확인할 수 있어야 한다.

  • [확인내용]

▶ docker01

  • 저장소에서 이미지 가져오기
[root@docker01 ~]# docker pull 211.183.3.202:5000/baseweb:1.0

  • index.html 파일 생성 후 tar로 묶어주기
[root@docker01 ~]# echo "Hi yang seung hyun" > index.html
[root@docker01 ~]# tar cvf web.tar index.html

  • Dockerfile 생성
[root@docker01 ~]# vi Dockerfile 
[root@docker01 ~]# cat Dockerfile 
FROM 211.183.3.202:5000/baseweb:1.0

  • 이미지 만들기
[root@docker01 ~]# docker build -t baseweb:2.0 .

  • 컨테이너 배포하기
[root@docker01 ~]# docker container run --name Hyun -d -p 8888:80 baseweb:2.0

10. 다음의 조건을 만족하는 docker-compose.yml 을 작성하고 이를 기반으로 서비스를 배포하라.(docker01)

  • 서비스가 배포될 네트워크 명 : testnetwork (미리 만들어 두어야 함)
  • 서비스에 연결할 볼륨 생성 : testvol (미리 만들어 두어야함)
  • 서비스 : xe --link--db
  • Xe 는 centos:7 에 설치된 xpressengine 을 활용하고 db는 mysql:5.7 이용
  • Mysql 의 데이터는 testvol 에 보관되어야 한다
  • 외부에 노출 시 호스트의 80 번 포트와 xe 컨테이너의 80번 포트가 매핑되어야 한다.
  • 모든 서비스는 항상 실행상태를 유지해야 한다
  • [확인내용]

▶ docker01

  • 네트워크 및 볼륨 생성
[root@docker01 ~]# docker network create testnetwork
[root@docker01 ~]# docker volume create testvol

  • Dockerfile
[root@docker01 ~]# vi Dockerfile 
[root@docker01 ~]# cat Dockerfile 
FROM centos:7
RUN yum clean all
RUN yum update -y
RUN yum -y install wget git httpd
RUN wget http://rpms.remirepo.net/enterprise/remi-release-7.rpm 
RUN yum -y localinstall remi-release-7.rpm
RUN yum -y install epel-release yum-utils
RUN yum-config-manager --enable remi-php74
RUN yum -y install php php-fpm php-gd php-mysql php-xml
RUN git clone https://github.com/xpressengine/xe-core.git /var/www/html/xe
WORKDIR /var/www/html/xe
RUN mkdir files
RUN chmod 707 -R files
WORKDIR /var/www/html
RUN chmod -R 707 xe
RUN chown -R apache:apache xe
EXPOSE 80
CMD httpd -D FOREGROUND

  • 이미지 생성
[root@docker01 ~]# docker build -t xe:1.0 .

  • docker-compose.yml
[root@docker01 ~]# vi docker-compose.yml
[root@docker01 ~]# cat docker-compose.yml 
version: '3.8'
services:
  xe:
    image: xe:1.0
    networks:
      - testnetwork
    ports:
      - "80:80"
    links:
      - db:mysql
    depends_on:
      - db
    restart: always
  db: 
    image: mysql:5.7
    networks: 
      - testnetwork
    volumes: 
      - testvol:/var/lib/mysql # VOLUME USING ISCSI
    environment:
      - MYSQL_ROOT_PASSWORD=test123
      - MYSQL_DATABASE=testdb
    restart: always

networks: 
  testnetwork: 
    external: true
volumes: 
  testvol: 
    external: true

  • 컨테이너 배포
[root@docker01 ~]# docker-compose up -d

  • 목록확인
[root@docker01 ~]# docker container ps

  • 211.183.3.201/xe 접속

0개의 댓글