docker

도커 (6)exec&Up&stop, RUN -y, ADD, EXPOSE, -DFOREGROUND, CMD [ ], &&, build -f

finepiz 2022. 1. 26. 14:40

============

컨테이너에 연결하는 두 번째 방법  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를 넣기

안 넣으면 이렇게 됨 Y/n할까요? 이때 입력이 들어가니 죽어버림

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명령어 라인을 최소화하는게 이미지를 작게 만드는 비법