Docker 2일차 command(run stop rm rmi), 컨테이너관리(exec), volume...

Docker 2일차 command(run stop rm rmi), 컨테이너관리(exec), volume...

*Docker command

docker pull [image] : [tag] # 이미지를 pulling 할 때 사용 , 로컬에 이미지를 받는것

서비스의 안정성을 위해 tag를 통해 버전을 꼭 정해주는 것이 좋다

docker images # 이미지 목록확인, IMAGE ID가 같다면 같은 IMAGE

docker hub에서 tags 의 DIGEST값(무결성 검증에 사용)이 같다면 같은 IMAGE

docker rm #하나 이상의 컨테이너 삭제

docker rmi #하나 이상의 이미지 삭제

docker rmi 5c #5c로 시작하는 IMAGE ID의 IMAGE가 지워진다

rm은 컨테이너 지우는 것으로 위에 언급, rm 또한 앞의 두자리가 유일하다면 삭제가능

docker save #파일 save, images에 있는 것만 가능

docker save -o httpd .tar httpd #httpd를 tar파일로 save

#tar xf httpd .tar 로 압축해제

*컨테이너 핵심기술

cgroup namespace layered filesystem

만약 tar파일로 아카이빙 해놨다면

docker load - i hello .tar #이런식으로 load 할 수 있다

docker create hello-world # 컨테이너 생성, start 안한 상태

docker create -it --name ubuntu1 ubuntu #create 할때부터 -it 옵션을 줘야 start할 때 -ai 옵션 통해서 터미널과 상호작용가능하다.

httpd는

docker create --name web4 httpd

docker start web4

docker run -d 로 수행하는 것과 같은결과가 나온다.

쉘을 사용하는 이미지는 create할 때 -it 붙여주고 start -ai 로 시작

아닌 상태에서는 그냥 create, start

docker rm web1 시도할 때 web1 이 running 상태이면 삭제 안된다

삭제하는 두가지 방법

docker rm web1 -f docker stop web1;docker rm web1

docker container prune #stop 상태의 컨테이너를 모두삭제

docker run --name ubuntu1 ubuntu hostname #마지막의 hostname은 command로 지정

#기본 bash 쉘이 실행되고 거기서 hostname 명령어를 수행하라는 뜻

docker run httpd pwd #가능

docker run -it httpd bash #가능

가능한 이유는 httpd 이미지에 쉘이 있기때문에 가능

docker stats #컨테이너의 실시강 상태확인

docker stats --no-stream #명령어 사용형태로 확인

docker run -d --name web1 httpd

docker top web1 # 컨테이너 내부의 프로세스

ps -ef #호스트의 프로세스

docker stop 과 docker pause의 차이

pause는 현상태를 유지하며(메모리의 데이터를 유지,전력공급) 종료, 일시중지..

stop 은 프로세스 kill

-e 옵션으로 환경변수 지정가능

docker run -it -e A=123 ubuntu

echo $A 로 확인

docker logs [container name] #컨테이너 로그를 확인

*mysql 실행방법

그냥 docker run -it mysql:5.7 하면 위와같은 로그에 오류가 뜨게된다.

docker run -d -e MYSQL_ROOT_PASSWORD=1234 mysql:5.7 로 루트패스워드 환경변수를 제공하여 정상적으로 실행가능하다.

docker run -it --name test --cpus 0.3 ubuntu #cpu 제한

docker run -it --cpus 0.3 --memory 100m ubuntu #메모리 제한

docker update --memory 200m [container id] #컨테이너의 메모리 증가시켜준다

*컨테이너 관리

#컨테이너 분리모드

attach 와 exec 모두 컨테이너가 돌아가고 있는 상황에서 접속하여 관리가 가능하다

docker exec -it web bash #web이 run 되는 상황에서 추가적으로 들어가서 작업가능하다

docker attach [container id] #stdin stdout error 를 컨테이너에 연결

attach 를 통해 컨테이너를 사용하고 나서 ctrl+c 하게되면 컨테이너가 stop된다

따라서 종료하지 않고 나가는 방법이 있는데

ctrl+P+Q 사용하면 된다 .

ex) httpd 컨테이너에 올렸다면 attach 해서 다른터미널통해 curl [ip주소] 로 표준출력입력에러 확인가능

#host에서 container로 복사작업

docker cp index.html [container name]:/usr/local등의 주소

docker diff [container name] #이미지와 컨테이너의 차이점(git diff 와 비슷하게 생각)

A:파일 추가됨

B:파일 변경됨

D:파일 삭제됨

*docker volume

**Bind mount

docker run -d --name web10 -v /home/vagrant/bindvol:/usr/local/apache2/htdocs httpd

bindvol 디렉토리에 index.html 파일이 있다면 web10 컨테이너의 htdocs 밑에 공유된다.

호스트에서 index.html 파일을 수정해도 htdocs 밑의 파일또한 바로 수정되는

공유폴더의 기능을 한다.

내용을 채워서도 제공가능하고, 안채워서도 가능하다

**Volume

docker volume create test

docker volume ls 로 생성확인 가능 & volume name 확인가능

빈 볼륨을 제공하면 이미지에 의해서 빈 볼륨이 채워지는 것

위의 Mountpoint는 호스트의 볼륨 저장소 마운트포인트

아파치의 index.html 볼륨을 제공하고 싶다면

docker run -d --name web3 -v test:/usr/local/apache2/htdocs httpd

이런식으로 생성하여 주면 test볼륨이 web3 컨테이너의 htdocs 디렉토리의 볼륨이 되는 것

docker inspect를 통해보면 Mounts 항목에 type이 bindmount 형식으로 run 했으면 bind, volume형식으로 run 했으면 volume 각각나올것이다.

*mysql 컨테이너 run하면 볼륨 자동생성

컨테이너를 삭제한다고 해서 mysql에 제공된 볼륨이 삭제되는 것은 아니다.

따라서 그 볼륨을 가지고 새로운 mysql 컨테이너에 데이터베이스를 유지한채 제공할 수 있다.

docker run -d --name db2 -v bf2473739ce2f01d8752c15de988f6b3fdfb613c3bb421520204d69c1d2f38c1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=1234 mysql:5.7

docker network ls #네트워크 이름,드라이버 확인

docker network inspect bridge #default 는 브릿지이고 이곳에 모든 컨테이너 들어가있다

실행중인 컨테이너까지 한번에 삭제하기

docker rm -f `docker ps -aq`# q는 quiet로 container id 목록만 나타내줌

*Docker Network

-p 는 포트포워딩 이라고 생각하면 된다 .

0.0.0.0 == 호스트의 ip(설정한 vm ip,192.168.200.30)로 들어오면 컨테이너의 80포트로 포워딩 해준다.

host type == host와 똑같은 네트워크를 공유한다.

host 충돌때문에 host type으로는 컨테이너 두개를 올릴 수 없다.

none type == 네트워크를 제공하지 않는다.

**link

이미 mydb라는 container를 만들어놨다고 가정

apt update; apt install mysql-client

mysql -h mydb -u root

wordpress mysql 두대

웹하나 디비하나 도커 명령어 두줄로 서비스 가능한 상태로 만들기

도커허브에서 환경변수확인 wordpress 것

링크 볼륨제공 포트확인 환경변수 어떤방식의 실행

iscsi, nfs 는 필요없고 볼륨만 제공하는 형태로 만들어보기

haproxy 도 설정해보기

*wordpress container 설정

docker run -d --name WP2 -p 80:80 --link DB -e WORDPRESS_DB_HOST=DB -e WORDPRESS_DB_USER=wordpress -e WORDPRESS_DB_PASSWORD=wordpress -e WORDPRESS_DB_NAME=wordpress wordpress

*DB container 설정(mysql)

docker volume create fordb #데이터베이스를 위한 볼륨생성

docker run -d --name DB -v fordb:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=1234 mysql:5.7

docker exec -it DB bash

mysql -u root -p

create user 'wordpress'@'%' identified by 'wordpress';

create database wordpress;

grant all privileges on wordpress.* to 'wordpress'@'%';

flush privileges;

quit

wordpress 접속은 host 의 ip인 192.168.200.30 으로 하면된다.

*docker run 의 --rm 옵션

실행시켜주고 container를 삭제시켜준다

docker run -it --rm hello-world 이런식으로…

#강사님이 한거로 보충

docker volume create wpweb #wordpress용 web 볼륨

docker run -d -v fordb:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=머시기 -e MYSQL_DATABASE=머시기 -e user 랑 -e

docker run -d -v wpweb:/var/www/html -e WORDPRESS_DB_HOST=DB -e WORDPRESS_DB_NAME=wordpress -e WORDPRESS_DB_USER=wordpress -e WORDPRESS_DB_PASSWORD=wordpress --link DB:DB -p 80:80 wordpress

DB:DB 는 DB 컨테이너의 별칭을 DB로 하겠다는 것 앞:컨테이너, 뒤:별칭

워드프레스의 /var/www/html 에 볼륨을 붙여주는 이유는 무엇인가?

워드프레스의 컨테이너에 문제가 있다면 wpweb 볼륨으로 다시 워드프레스 컨테이너를 생성할 수 있으므로 사용해주는 것이다.

haproxy 에 bind mount 를 통해 설정파일을 제공해준다(haproxy 이미지에 설정파일이 없다)

포트번호로 haproxy 하고싶어

*haproxy container 설정

global

daemon

maxconn 1024

defaults

balance roundrobin

timeout client 60s

timeout connect 60s

timeout server 60s

frontend web-in

bind *:80

default_backend web-back

backend web-back

server web1 web1:80 check

server web2 web2:80 check

가장 기본적인 cfg 파일의 형식

docker run -d --name lb -v /home/vagrant/haproxy/:/usr/local/etc/haproxy/

디렉토리 디렉토리 마운트도 가능하고, 파일-파일 마운팅도 가능하다.

-p 80:80

172.17.0.5 그리고 6

docker run -d --name lb -v /home/vagrant/haproxy/:/usr/local/etc/haproxy/ --link web1:web1 --link web2:web2 -p 80:80 haproxy:2.4

docker run -d -v wpweb:/var/www/html -e WORDPRESS_DB_HOST=DB -e WORDPRESS_DB_NAME=wordpress -e WORDPRESS_DB_USER=wordpress -e WORDPRESS_DB_PASSWORD=wordpress --link DB:DB -p 80:80 wordpress

from http://ictssp04046.tistory.com/35 by ccl(A) rewrite - 2021-07-11 12:59:05