Docker

박기원·2022년 7월 8일
0

Docker

목록 보기
1/2
post-thumbnail

모든 컨테이너 삭제

docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
docker rmi -f $(docker images -q)

curl https://www.nginx.com/ -o index.html
웹페이지 긁어오기

Docker 이미지

Docker 컨테이너를 구성하는 파일 시스템과 실행할 애플리케이션 설정을 하나로 합친 것으로, 컨테이너를 생성하는 템플릿 역할을 한다. like AMI

Docker 컨테이너

Docker 이미지를 기반으로 생성되며, 파일 시스템과 애플리케이션이 구체화되어 실행되는 상태이다.

CentOS Docker 설치

Docker CE;
Community Editiion 무료 오픈 소스
EE Enterprise Editon 유료, 보안 관련 서비스 제공

# curl -fsSL https://get.docker.com/ | sh
# yum -y install bash-completion wget unzip net-tools mysql telnet rdate
# rdate -s time.bora.net && clock -w
# curl https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker -o /etc/bash_completion.d/docker.sh
# systemctl start docker && systemctl enable docker

Ubuntu Docker 설치

$ sudo apt update
$ sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial stable"
$ sudo apt update
$ sudo apt-cache policy docker-ce
$ sudo apt install docker-ce

AWS Docker 설치

#!/bin/bash
amazon-linux-extras install docker -y
systemctl start docker && systemctl enable docker
curl https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker -o /etc/bash_completion.d/docker.sh
usermod -a -G docker ec2-user
docker run -d -p 80:80 --name=test-site rldnjsdlsi/web-site:v2.0

Docker 기본 명령어

# docker search nginx
# docker image pull nginx
# docker image ls
# docker image inspect --format="{{ .Os}}" nginx  

-f 옵션 = format 원하는 정보만 출력
nginx OS 상세 정보

# docker container create -p 80:80 --name webserver nginx


-p 옵션 = publish
예를 들어 nginx, centos, ubuntu 3가지 이미지를 받았으면 80:80, 81:80, 82:80 이렇게 포트포워딩을 해준다. 앞쪽이 호스트 포트
# docker container start webserver
# docker container stop webserver
# docker container start webserver
# docker container rm -f webserver
# docker container run -p 80:80 --name webserver nginx
# docker container run -d -p 80:80 --name webserver nginx

-d 옵션 = detach
또 다른 웹 서버를 만들고 싶다면 호스트 포트와 이름 두 가지를 꼭 바꿔줘야한다.
이름이 겹칠 시에는 다시 바꿔주면 된다. 하지만 포트가 충돌난 경우는 이미 충돌난 컨테이너가 생성되기 때문에 충돌난 컨테이너를 지우고 다시 생성해야한다.
# docker container run --name test_cal centos /bin/cal

다른 이미지의 명령어를 필요로 할때에도 사용가능하다.
ex) cal 명령어는 centos명령어이다. 컨테이너를 사용해 실행가능
    계속 실행되는 것이 아니기 때문에 작업 후에는 멈춰진다.

⭐⭐⭐⭐⭐
# docker container run -it --name test_bash centos /bin/bash

ex) centos 터미널을 실행
-it 옵션 = interactive terminal / 터미널과 상호적으로 주고 받겠다.
-q 옵션 = quiet / 이미지 ID만 표시

# docker container run -d --name test_ping centos /bin/ping localhost
# docker container logs -t test_ping
# docker container run -d -p 8080:80 --name test_port nginx

# docker container stats 컨테이너 이름

컨테이너 상태확인 (ID, NAME, CPU, MEM USAGE)

# docker container run -d -p 8181:80 --cpus 1 --memory=256m --name test_resource nginx
# docker container run -d -p 8282:80 --cpus 1 --memory=256m -v /tmp:/usr/share/nginx/html --name volume-container nginx 

⭐⭐⭐
-v 옵션 = volume
- bind mount
/tmp:/usr/share/nginx/html = 호스트의 경로:컨테이너의 경로
호스트와 컨테이너를 공유한다. 

# docker container ls
# docker container ls -a
# docker container ls -a -f name=test_webserver
# docker container ls -a -f exited=0
# docker container ls -a --format "table {{.Names}}\t{{.Status}}"
# docker container attach test_bash

[root@1689b6318c35 /]# ctrl + p, ctrl +q 를 입력
프로세스를 exit하지 않고 나오기

# docker container ls
# docker container exec -it test_port /bin/echo "Hello world"
# docker container exec -it test_port /bin/bash

⭐⭐⭐⭐⭐⭐
exec = 동작 중인 컨테이너에서 프로세스 실행
attach랑 다르게 exit를 쳐도 프로세스가 중지되지 않는다.
원리는 exec라는 실행 명령과 

# docker container top test_port
# docker container port test_port

# docker container rename test_port webserver
컨테이너 이름 바꾸기

⭐⭐⭐⭐
# docker container cp webserver:/usr/share/nginx/html/index.html /root/index.html
# docker container cp ./index.html webserver:/usr/share/nginx/html/index.html

컨테이너 안에 있는 파일을 복사한다.
webserver의 index.html파일을 호스트로 복사한다.

# docker container diff webserver
컨테이너 레이어의 변경사항을 보여주는 명령어

⭐⭐⭐⭐⭐
# docker container commit -a "wow<test@example.com>" -m "NICE TO MEET YOU" webserver test_commit:v1.0

웹 서버를 이미지로 만든다.
작성자는 선택사항이다.
-m 옵션 = 메세지로 남긴다

# docker image ls
# docker image inspect test_commit:v1.0
# docker image save -o test_commit.tar test_commit:v1.0
# docker image load -i test_commit.tar

이미지를 tar파일로 저장해서 다른 서버로 옮긴 후 load로 tar를 image로 변환한다.

# docker image ls
# docker container run -d -p 80:80 --name webserver test_commit:v1.0

# docker run --name test_cal1 --rm centos /bin/cal
임시 컨테이너를 실행하지만 실행 후 바로 삭제해줘라

# docker network ls
# docker network ls -q --filter driver=bridge
# docker network create -d bridge --subnet 192.168.123.0/24 --ip-range 192.168.123.128/25 test_bridge

새로운 네트워크 영역을 생성한다. 

# docker network rm test_bridge
# docker network connect test_bridge webserver

미리 만들어놓은 컨테이너에 내가 만든 네트워크를 연결시킨다

같은 네트워크에 컨테이너가 여러 개 있다면 도메인처럼 서로가 통신이 된다. 

컨테이너의 이름을 가지고 통신이 된다. 

# docker container inspect webserver
# docker network disconnect test_bridge webserver
# docker container run -d --name webserver1 --network test_bridge -p 8080:80 nginx
# docker network inspect test_bridge

Wordpress DB 설치

- dbserver
# docker run -d -p 3306:3306 --name dbserver \
-e MYSQL_DATABASE=wordpress \
-e MYSQL_USER=wpuser \
-e MYSQL_PASSWORD=wppass \
-e MYSQL_ROOT_PASSWORD=password --network test_bridge mariadb

-e 옵션 = environment 환경변수

Web Server 설치

# docker run -it -d -p 8888:80 --name apache centos:7
# docker exec -it apache bash
yum install -y httpd php php-mysql php-gd php-mbstring wget unzip
wget https://ko.wordpress.org/wordpress-4.8.2-ko_KR.zip
cd /var/www/html
unzip /wordpress-4.8.2-ko_KR.zip
chown -R apache:apache wordpress
httpd &

Docker 파일 이해

# vi Dockerfile
FROM ubuntu:18.04
MAINTAINER johnlee
LABEL "name"="webserver"
ENV aloha=date
ENV path=/var/www/html
RUN sed -i 's/archive.ubuntu.com/ftp.daumkakao.com/g' /etc/apt/sources.list
RUN apt-get update
RUN apt-get install apache2 -y
COPY nihao /var/www/html/nihao
COPY hello.html $path
ADD aws.tar /var/www/html
WORKDIR /var/www/html
RUN echo ohayo >> ohayo.html
VOLUME /var/www/html
EXPOSE 80
ENTRYPOINT ["apachectl"]
CMD ["-D", "FOREGROUND"]

Dockerfile 문법

  • FROM : 베이스 이미지 지정
  • MAINTAINER : 유지보수를 하는 사람의 인적사항
  • LABEL : 일종의 태그
  • ENV : 컨테이너 내의 환경변수 설정
  • RUN : 직관적으로 쉘 스크립트를 사용하려고 할 때
  • COPY : 호스트에 있는 내용을 컨테이너로 복사
  • ADD : 복사하려는 대상 파일이 압축 파일(tar, tar.gz)일 경우, 해당 파일의 압축을 해제하여 복사
  • WORKDIR : 작업 디렉토리 지정 / 경로 변경 / cd 같은거
  • VOLUME : 볼륨 마운트 / 호스트의 경로는 지정할 수 없음
  • EXPOSE : 포트 할당 80으로 설정 했을 시 컨테이너는 80으로 고정되고 호스트는 랜덤으로 배정된다. run 시 -P로 실행
  • ENTRYPOINT : 데몬 실행 / 정해진 형식으로만 사용
  • CMD : 데몬 실행 / 사용자 커스텀에 의해 사용 가능 / 대괄호[ ]를 넣는게 퍼포먼스가 훨씬 빠르다.

Dockerfile

# tar cvf aws.tar images index.html 
# mkdir test && cd $_
FROM nginx:latest
ADD aws.tar /usr/share/nginx/html
CMD ["nginx", "-g", "daemon off;"]

Docker 데이터 관리

- Bind Mount
# mkdir volume && cd $_
# mkdir bm01 ; touch bm01/test.txt
# docker container run -itd --name bm-test -v /root/volume/bm01:/mnt centos:7

/bm01 => 호스트 경로
/mnt => 컨테이너 경로

# docker container exec bm-test ls /mnt

- Volume
# docker volume create my-vol01
# docker volume list
# docker volume inspect my-vol01
"Mountpoint": "/var/lib/docker/volumes/my-vol01/_data"
# docker container run -itd --name vol-test -v my-vol01:/mnt centos:7
# docker container run -itd -p 801:80 --name vol-web -v my-vol01:/usr/local/apache2/htdocs:ro httpd:latest
# curl 192.168.0.151:801
<html><body><h1>It works!</h1></body></html>
# docker container exec vol-test sh -c "echo "Nihao" > /mnt/index.html"
# curl 192.168.0.151:801
Nihao

Docker 네트워크 관리

# docker network list
# docker network inspect bridge
"com.docker.network.bridge.name": "docker0",
# docker network create new-net --subnet 192.168.0.0/16 --gateway 192.168.0.1
# docker network list

onbuild 명령어 활용

운영자 역할

# mkdir onbuild && cd $_
# vi Dockerfile.base
FROM ubuntu:16.04
RUN sed -i 's/archive.ubuntu.com/ftp.daumkakao.com/g' /etc/apt/sources.list

archive.ubuntu.com을 카카오로 변환

RUN apt-get -y update
RUN apt-get -y install nginx
EXPOSE 80
ONBUILD ADD website*.tar /var/www/html/

개발자들이 수시로 바꾸니까 onbuild를 써서 컨테이너 실행 후 실행

CMD ["nginx", "-g", "daemon off;"]

# docker build -t halilinux/web-base:v1.0 -f Dockerfile.base .

-f 옵션 = Dockerfile 이 아닌 다른 이름이라도 실행

# docker login
# docker push halilinux/web-base:v1.0
# vi Dockerfile
FROM halilinux/web-base:v1.0

개발자 역할

# mkdir onbuild && cd $_
# ls
website.tar
Dockerfile

# docker build -t halilinux/photoview-image:v1.0 .
# docker run -d -p 80:80 --name=photoview halilinux/photoview-image:v1.0
# docker login
# docker push halilinux/photoview-image:v1.0

운영자 역할(AWS)

# docker run -d -p 80:80 --name=test-site rldnjsdlsi/web-site:v2.0

VM이 껐다 켜져도 다시 실행

docker run -d -p 8888:80 --restart always --name test-restart rldnjsdlsi/web-site:v1.0

Docker 사설 레지스트리

# docker run -d -p 5000:5000 --restart=always --name private-docker-registry registry # 저장소 서버 생성
# vi /etc/docker/daemon.json # 클라이언트
{ "insecure-registries":["172.25.0.148:5000"] }
# systemctl restart docker

# docker tag rldnjsdlsi/web-site:v2.0 54.180.85.91:5000/web-site:v2.0

이미지에 태그달아줌

# docker push 54.180.85.91:5000/web-site:v2.0

사설 레지스트리에 올리깅

Wordpress Dockerfile

# mkdir wordpress && cd $_
# vi Dockerfile
FROM centos:7
MAINTAINER itssp0405@gmail.com
RUN yum install -y httpd php php-mysql php-gd php-mbstring wget unzip
RUN wget https://ko.wordpress.org/wordpress-4.8.2-ko_KR.zip
WORKDIR /var/www/html
RUN unzip /wordpress-4.8.2-ko_KR.zip
RUN chown -R apache:apache wordpress
CMD httpd -DFOREGROUND
# docker image build -t wordpress:v1.0 .
# docker container run -d -p 88:80 --name wordpress wordpress:v1.0 

0개의 댓글