[LG CNS AM CAMP 1기] 백엔드 II 12 | Docker

letthem·2025년 2월 12일
0

LG CNS AM CAMP 1기

목록 보기
28/31
post-thumbnail

Dockerfile 작성할 때 유의사항

사용자 입력이 발생하지 않도록 하고, 포그라운드 프로세스로 실행되도록 해야 함
중지되지 않도록 !!

우분투 컨테이너를 실행하고 웹 서버를 설치해서 hello.html 파일을 /var/www/html 디렉터리에 복사

#1 작업 디렉터리를 만들고 이동

mkdir c:\docker\webserver

cd c:\docker\webserver

#2 우분투 컨테이너를 실행하고 아파치 웹 서버를 설치

docker container run -p 8080:80 -it --name myweb --rm ubuntu

root@d8baf45ee47c:/#    <= -d 옵션을 사용하지 않았기 때문에 attach 모드로 컨테이너가 실행
~~~~ ~~~~~~~~~~~~  ~
|    |             |
|    |             +-- 권한 ⇒ 일반사용자($), 루트사용자(#)   
|    +-- 호스트 이름 = 컨테이너 ID 
+-- 사용자 계정

apt-get update

apt-get install apache2

apachectl start

echo "ServerName localhost" >> /etc/apache2/apache2.conf

: echo "ServerName localhost" 이 내용을 /etc/apache2/apache2.conf 이 파일에 써라

  • echo "ServerName localhost" : 매개변수로 전달된 값을 콘솔에 출력

  • >> : 입출력 대상을 변경 ( > : 덮어쓰기, >> : 추가하기 )

cat /etc/apache2/apache2.conf

가장 뒤에 ServerName localhost가 붙을 것을 확인할 수 있다.

apachectl restart

ps -efl

F S UID    	PID  PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY      	TIME CMD
4 S root     	1 	0  0  80   0 -  1147 do_wai 00:36 pts/0	00:00:00 /bin/bash
5 S root  	3452 	1  0  80   0 -  1703 core_s 00:41 ?    	00:00:00 /usr/sbin/apache2 -k start
5 S www-data  3514  3452  0  80   0 - 499492 - 	00:46 ?    	00:00:00 /usr/sbin/apache2 -k start
5 S www-data  3515  3452  0  80   0 - 499492 - 	00:46 ?    	00:00:00 /usr/sbin/apache2 -k start
0 R root  	3573 	1  0  80   0 -  1984 -  	00:47 pts/0	00:00:00 ps -efl

apache 관련 프로세스들이 잘 돌고 있는 것을 확인할 수 있다.

ctrl + p + q ⇐ detach 모드로 전환 (--detach-keys 옵션을 이용해서 변경 가능)

이거 잘 안 돼서 그냥 나갔다가

docker container run -p 8080:80 -it -d --name myweb --rm ubuntu 이렇게 함

docker container ls

CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS                  NAMES
ca30caadbd22   ubuntu    "/bin/bash"   23 seconds ago   Up 22 seconds   0.0.0.0:8080->80/tcp   myweb

#3 웹 브라우저를 이용해서 아파치의 실행을 확인

localhost:8080 했는데 밑에처럼 안됨 ㅜㅜ

#4 hello.html 파일을 웹 루트 디렉터리에 추가

PS C:\docker\webserver> docker container attach myweb
root@01efebf7fa6d:/#

root@01efebf7fa6d:/# ls /var/www/html
index.html

root@01efebf7fa6d:/# vi /var/www/html/hello.html
\bash: vi: command not found

root@01efebf7fa6d:/# ctrl + p + q

PS C:\docker\webserver>

#5 VSCode를 이용해서 hello.html 파일을 작성

PS C:\docker> code .

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>Hello, Docker !!! ^..^</h1>
</body>
</html>

#6 호스트의 hello.html 파일을 컨테이너 내부의 /var/www/html/hello.html 파일로 복사

docker container cp hello.html myweb:/var/www/html

#7 웹 브라우저를 이용해서 확인

동일한 기능을 제공하는 Dockerfile을 작성하고, 컨테이너 이미지를 생성

#1 Dockerfile 작성

FROM  ubuntu
RUN   apt-get update
RUN   apt-get install apache2
#RUN  apachectl start
RUN   echo "ServerName localhost" >> /etc/apache2/apache2.conf
#RUN  apachectl restart
COPY  hello.html /var/www/html/
CMD   apachectl start

COPY와 ADD는 비슷하지만 차이가 있다

#2 이미지 빌드

docker image build --tag mywebserver:v1 .

...
1.759 Do you want to continue? [Y/n] Abort.
------				⇐ 이미지를 빌드하는 과정에서 사용자 입력을 요구하면 오류로 빌드가 중단됨
...

#3 Dockerfile 수정 ⇐ 사용자 입력을 필요하지 않도록

FROM  ubuntu
ENV   DEBIAN_FRONTEND=noninteractive
RUN   apt-get update
RUN   apt-get install -y apache2
#RUN  apachectl start
RUN   echo "ServerName localhost" >> /etc/apache2/apache2.conf
#RUN  apachectl restart
COPY  hello.html /var/www/html/
CMD   apachectl start

참고 ⇒ https://www.cyberciti.biz/faq/explain-debian_frontend-apt-get-variable-for-ubuntu-debian/

#4 이미지를 빌드 및 컨테이너를 실행

docker image build --tag mywebserver:v1 .

docker image ls

REPOSITORY	TAG   	IMAGE ID       CREATED      	   SIZE
mywebserver   v1    	a0ad3ba6e326   30 seconds ago   238MB
ubuntu    	latest	a04dc4851cbc   2 weeks ago  	78.1MB

docker container run -d --name mywebserver -p 9090:80 --rm mywebserver:v1

cb5fd6cf430b5ffa35b643b9453c0b9414d7ccdffee99f5899fd4fda06244786

docker container ls -a
⇐ mywebserver 컨테이너가 삭제되고 없음
아파치 웹 서버는 기본적으로 백그라운드로 실행
→ 컨테이너 실행과 동시에 아파치를 백그라운드로 실행하고, 컨테이너를 종료

CONTAINER ID   IMAGE 	COMMAND   	CREATED      	STATUS      	PORTS              	NAMES
01efebf7fa6d   ubuntu	"/bin/bash"   38 minutes ago   Up 38 minutes   0.0.0.0:8080->80/tcp   myweb

docker container run --name mywebserver -p 9090:80 --rm mywebserver:v1

docker container run --name mywebserver -p 9090:80 --rm mywebserver:v1
⇐ -d 옵션을 생략했으므로 attach 모드로 실행
⇐ 컨테이너가 실행과 동시에 종료되었기 때문에 호스트로 제어권이 반환

원인 : apache가 백그라운드로 실행되니까!

#5 Dockerfile 수정 ⇒ 아파치 웹 서버를 포그라운드로 실행

FROM  ubuntu
ENV   DEBIAN_FRONTEND=noninterative
RUN   apt-get update
RUN   apt-get install -y apache2
#RUN  apachectl start
RUN   echo "ServerName localhost" >> /etc/apache2/apache2.conf
#RUN  apachectl restart
COPY  hello.html /var/www/html/
CMD   apachectl -D FOREGROUND

#6 이미지 빌드 및 컨테이너 실행

docker image build --tag mywebserver:v2 .

docker image ls

REPOSITORY	TAG   	IMAGE ID   	CREATED      	SIZE
mywebserver   v1    	a0ad3ba6e326   11 minutes ago   238MB
mywebserver   v2    	97ca973a2aca   11 minutes ago   238MB
ubuntu    	latest	a04dc4851cbc   2 weeks ago  	78.1MB

docker container run -d --name mywebserver -p 9090:80 --rm mywebserver:v2

074399d44a10ec31408aa68c78b1e4cd5c521f4c4a66548c85a09ca50b7050ee

docker container ls

CONTAINER ID   IMAGE        	COMMAND               	CREATED      	STATUS      	PORTS              	NAMES
074399d44a10   mywebserver:v2   "/bin/sh -c 'apachec…"   15 seconds ago   Up 14 seconds   0.0.0.0:9090->80/tcp   mywebserver
01efebf7fa6d   ubuntu       	"/bin/bash"           	47 minutes ago   Up 47 minutes   0.0.0.0:8080->80/tcp   myweb

#7 브라우저를 이용해서 동작을 확인

도커 이미지 크기가 커지지 않도록 유의

크기를 신경쓰지 않고 이미지를 빌드

FROM  ubuntu
RUN   mkdir /test
RUN   fallocate -l 100m /test/dummy
RUN   rm /test/dummy

PS C:\docker\layer> docker image build -t falloc_100m -f Dockerfile_100m .
                                                      ~~~~~~~~~~~~~~~~~~
                                                      빌드에 사용할 Dockerfile 이름을 지정   

PS C:\docker\layer> docker image ls
REPOSITORY	TAG   	IMAGE ID   	CREATED      	SIZE
falloc_100m   latest	386866128967   56 seconds ago   183MB

PS C:\docker\layer> docker image pull ubuntu

PS C:\docker\layer> docker image ls
REPOSITORY	TAG   	IMAGE ID   	CREATED          	SIZE
falloc_100m   latest	386866128967   About a minute ago   183MB		⇐ 대략 100m 이상 켜졌음
ubuntu    	latest	a04dc4851cbc   2 weeks ago      	78.1MB

명령어를 묶어서 실행 ⇒ RUN 지시어를 가급적 많이 사용하지 않음 ⇒ 최종 결과만 레이어로 기록

FROM  ubuntu
RUN   mkdir /test  &&  \
      fallocate -l 100m /test/dummy  &&  \
      rm /test/dummy
PS C:\docker\layer> docker image build -t falloc_0m -f Dockerfile_0m .

PS C:\docker\layer> docker image ls
REPOSITORY	TAG   	IMAGE ID   	CREATED      	SIZE
falloc_0m 	latest	f0c8def88f4f   15 seconds ago   78.1MB	⇐ 베이스 이미지와 크기가 거의 동일
falloc_100m   latest	386866128967   7 minutes ago	183MB
ubuntu    	latest	a04dc4851cbc   2 weeks ago  	78.1MB

불필요한 도구를 설치하지 않음

개발 및 디버깅 용도로 사용하는 도구(예: vi, gcc, javac, ifconfig, ...)
캐시, 로그 파일

###

빌더 패턴

package main


import "fmt"


func main() {
    fmt.Println("Hello, Docker")
}

Dockerfile_builder ⇒ go 소스 코드를 컴파일해서 하나의 실행 파일(hello.exe)을 생성

FROM    golang
WORKDIR /goapp
COPY    hello.go .
RUN     go env -w GO111MODULE=auto
RUN     go build -o hello.exe .

워드프레스는 사이트의 기본 URL(예: siteurl 및 home)을 데이터베이스에 저장합니다. 보통 이 값은 wp_options 테이블에 기록되는데, 한 번 설정되면 컨테이너를 삭제해도 별도의 DB(예: docker 컨테이너로 실행 중인 wordpressdb)에 저장된 값은 그대로 남게 됩니다.

따라서 처음 생성했을 때 임의로 할당된 포트 번호(55742)가 사이트 URL에 포함되어 저장되고, 이후 컨테이너를 새로 만들더라도 DB의 정보(즉, 기존의 포트 번호)를 그대로 사용하게 되어 localhost:56045로 접속하더라도 자동으로 55742 포트로 리다이렉트 되는 것입니다.

이 문제를 해결하려면 워드프레스 DB의 siteurl과 home 값을 새 포트 번호에 맞게 수정해주어야 합니다. 데이터베이스에 직접 접속하여 wp_options 테이블의 해당 값을 변경하거나, wp-config.php에 상수를 정의하는 방법도 있습니다.

wp_options 테이블 직접
수정하니 잘되는것 같습니다.

0개의 댓글

관련 채용 정보