도커 (6)exec&Up&stop, RUN -y, ADD, EXPOSE, -DFOREGROUND, CMD [ ], &&, build -f
============
컨테이너에 연결하는 두 번째 방법 exec
docker container exec 컨테이너식별자 쉘 명령 이용 ⇒ 해당 컨테이너에 쉘이 있는 경우 사용 가능
PS C:\Users\myanj> docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8ea2095ac009 example/echo:latest "/bin/bash" 2 minutes ago Up 2 minutes
해당하는 컨테이너에 명령어를 전달할 때 exec를 씀
그럼 명령어의 실행결과를 출력
PS C:\Users\myanj> docker container exec 8ea2095ac009 ls -al
total 16 ~~~~~~ ⇐ 8ea2095ac009 컨테이너 내부에서 ls -al 명령어를 실행
drwxrwxrwx 4 root root 4096 Jul 17 2018 .
drwxr-xr-x 1 root root 4096 Jan 25 03:03 ..
drwxrwxrwx 2 root root 4096 Jul 17 2018 bin
drwxrwxrwx 2 root root 4096 Jul 17 2018 src
exec -it + /bin/bash :
PS C:\Users\myanj> docker container exec -it 8ea2095ac009 /bin/bash
root@8ea2095ac009:/go# ls /echo
main.go
root@8ea2095ac009:/go# cat /echo/main.go
package main
:
:
root@8ea2095ac009:/go# exit
exit
PS C:\Users\myanj> docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8ea2095ac009 example/echo:latest "/bin/bash" 6 minutes ago Up 6 minutes 0.0.0.0:57257->8080/tcp elastic_brattain
2fdfc16ec42c example/echo:latest "/bin/bash" 49 minutes ago Up 49 minutes 0.0.0.0:58496->8080/tcp zealous_mcnulty
9317682730d9 example/echo:latest "go run /echo/main.go" 54 minutes ago Up 54 minutes 0.0.0.0:58470->8080/tcp tender_merkle
Up??????????????
/bin/bash 는 쉘을 실행한다
아 터미널 키는거랑 쉘 실행하는거랑 다른건가?? 그렇겠네
exec는 메인 command의 bin/bash가 아니고 새로 /bin/bash를 하나 킨 것, 이땐 exit해도 컨테이너 안죽어
attach는 메인 프로세스에 붙는다 그래서 exit하면 메인 프로세스가 죽으면 컨테이너가 stop이 됨
이렇게 해보니까 exec해서 /bin/bash(쉘)를 실행해서 작업하는게 제일 안전해(해당 컨테이너 내부에 쉘이 있다는 전제하에) 아하~~
============
Dockerfile 작성 시 유의사항
우분투 이미지에
아파치 웹 서버를 설치하고
로컬에 있는 hello.html 파일을 아파치 웹 루트 디렉터리(/var/www/html)에 복사
c:\docker\webserver_01\hello.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>My WebServer</title> </head> <body> <h1>^..^v</h1> </body> </html> |
c:\docker\webserver_01\Dockerfile
도커 플러그인 깔면 이런거 나옴
버전 안적으면 latest
도커허브에 가서
여기서 버전 보고
쓸 때
여기다 쓰면 됨
우분투에 아파치를 깔려면
우분투 저렇게 FROM해놓고
RUN에 우분투에 아파치 까는법 검색해서 명령어를 집어넣음
-y넣으면 묻지않고 설치, 이걸 안하면 apache를 설치할까요? 묻는 상태에서 멈춘다
COPY와 ADD는 동일하다고 보면 됨
옮길 수 있는 대상의 차이가 날 뿐 기능은 똑같아
WORKDIR은 해줘도되고 안해줘도 되고. 작업디렉토리. 컨테이너 내부에서 디렉토리를 필요로 하는 경우 이걸 참조 --생활코딩 도커 글에 자세히 있다
EXPOSE : 이걸로 프로그램이 지정한 포트를 해놓으면 나중에 docker fun시 docker run -P 옵션만 해두면 자동으로 그 포트가 연결이 된다.
https://soft.plusblog.co.kr/139
-P는 호스트의 랜덤포트와 컨테이너의 EXPOSE로 명시한 포트가 매칭된다!
CMD :
-DFOREGROUND --포그라운드,
내가 걔를 죽이기 전까진 계속 떠있고 프로세스를 반환하지 않는다
서비스는 백그라운드로 돌면 안된다. 실행하고 나면 백그라운드로 돌리니까 호스트로 리턴. 죽는다
포그라운드, apachectl 호출하고 그게 끝날때까지 기다린다. 누가 죽으라고 하든지 하면 끝나고 return되고 호스트로 반환됨
백그라운드, apachectl 호출했으니까 return
▽대체 뭔소린지
---
c:\docker\webserver_01\Dockerfile
FROM ubuntu:18.04 # 베이스 이미지 지정 RUN apt-get update # 설치 가능한 패키지 리스트를 최신화 RUN apt-get install -y apache2 # apache2 패키지 설치 (설치 여부 질문 없이 설치 진행) ADD ./hello.html /var/www/html/ # 호스트의 hello.html 파일을 컨테이너 내부의 /var/www/html 디렉터리 아래에 추가 # ~~~~~~~~~~~~~ 아파치 기본 웹 루트 WORKDIR /var/www/html # 작업 디렉터리 설정 EXPOSE 80 # 호스트와 연결할 포트 번호를 설정 (-p 옵션을 이용해서 외부에 노출해야 함) CMD apachectl start -DFOREGROUND # 아파치 웹 서버 실행 |
CMD [ ] 는 쉘이없는경우 --확인할 수 없으니 보통 이걸로 함
아래는 쉘이있는경우(우분투는 쉘 있다)
PS C:\docker\webserver_01> docker image build -t mywebserver .
PS C:\docker\webserver_01> docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
mywebserver latest 8e9da644eef8 42 seconds ago 199MB
example/echo latest b67f2e12147f 3 hours ago 750MB
myanjini/echo 1.0 b67f2e12147f 3 hours ago 750MB
httpd latest dabbfbe0c57b 5 weeks ago 144MB
만들어짐
이 이미지를 실행하려면
docker container run --name mywebserver -p 8888:80 mywebserver
============
도커파일 만들 때 유의사항 : &&
1)설치할 때 사용자 입력이 가면 안된다 : -y를 넣기
2)해당 어플리케이션이 계속 실행될 수 있도록 : -DFOREGROUND
3)불필요한 명령어 라인을 줄이기
임의 크기의 파일을 생성 후 삭제하는 도커파일을 생성해보면
c:\docker\falloc_100m\Dockerfile
FROM ubuntu RUN mkdir /test RUN fallocate -l 100m /test/dumy # 100M 크기의 파일을 생성 RUN rm /test/dumy # 파일을 삭제 |
생성하고 삭제하니까 변화가 없는것임
디렉토리 옮기고
docker image build -t falloc_100m .
하면
PS C:\docker\webserver_01> cd ..
PS C:\docker> cd .\falloc_100m\
PS C:\docker\falloc_100m> docker image build -t falloc_100m .
앞에 우분투 가져온게 있으니 순식간에 만든대
PS C:\docker\falloc_100m> docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
falloc_100m latest 753c1929c9a4 2 minutes ago 178MB
<none> <none> 8e9da644eef8 20 minutes ago 199MB
<none> <none> 272d0660ed3b 20 minutes ago 199MB
mywebserver latest 21b48f1604e0 20 minutes ago 199MB
example/echo latest b67f2e12147f 4 hours ago 750MB
myanjini/echo 1.0 b67f2e12147f 4 hours ago 750MB
ubuntu latest d13c942271d6 2 weeks ago 72.8MB
httpd latest dabbfbe0c57b 5 weeks ago 144MB
파일을 삭제했으나 100m쯤의 크기를 차지하고 있다
원래 베이스 이미지가 있으면 그 위에다 명령어 만큼 레이어를 차곡차곡 쌓는다
도커 명령어 줄 수 만큼 도커 파일에 레이어가 생기므로
중간에 컨테이너도 같은 수 만큼이 생성되고 삭제된다
->불필요하게 많은 명령어 줄 수를 사용하면 용량이 커진다
▽있는 이미지 -> 지우고 없는 이미지 이렇게 두개라는건가
용량을 줄이려면?
명령어를 줄이기 && ( 리눅스 , 윈도우cmd는 &하나, 파워쉘은 & 아님 )
&& : 명령어 실행하고 문제없이 실행되면 그 다음 명령어 이어서 실행하는 것
c:\docker\Dockerfile_falloc_0m
FROM ubuntu RUN mkdir /test && fallocate -l 100m /test/dumy && rm /test/dumy |
3개를 한줄로
폴더안에 도커파일 여러개여서 지정해야된다
-f 구나?
Path를 포함하는데도 경로를 지정해준다
그래서 그냥 뺌
3줄을 하나로 했더니??
PS C:\docker> docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
falloc_0m latest 9154898f54b8 23 seconds ago 72.8MB
falloc_100m latest 753c1929c9a4 12 minutes ago 178MB
mywebserver latest 21b48f1604e0 30 minutes ago 199MB
<none> <none> 8e9da644eef8 30 minutes ago 199MB
<none> <none> 272d0660ed3b 30 minutes ago 199MB
example/echo latest b67f2e12147f 4 hours ago 750MB
myanjini/echo 1.0 b67f2e12147f 4 hours ago 750MB
ubuntu latest d13c942271d6 2 weeks ago 72.8MB
httpd latest dabbfbe0c57b 5 weeks ago 144MB
똑같네
: 가급적 RUN명령어 라인을 최소화하는게 이미지를 작게 만드는 비법