https://certbot.eff.org/docs/index.html

docker를 활용해서 certbot으로 무료 인증서를 발급아서 적용해 보도록 하겠습니다.

certbot 의 manual 기능을 이용하여 서버외 다른 pc에서 인증서를 발급받기 위하여

dns서버에서 txt값으로 검증통해 발급을 받도록 합니다.

 

1.docker로 실행

- 인증서가 저장될 host 경로를 volume으로 설정

- domain을 입력합니다.

docker run -it --rm --name certbot   -v '[host_path]:/etc/letsencrypt'   -v '

[host_path]:/var/lib/letsencrypt'   certbot/certbot certonly -d '[domain]' --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory

 

2 설정화면

1. email설정

Saving debug log to /var/log/letsencrypt/letsencrypt.log

Plugins selected: Authenticator manual, Installer None

Enter email address (used for urgent renewal and security notices)

(Enter 'c' to cancel): [email]

 

2.동의

Please read the Terms of Service at

https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must

agree in order to register with the ACME server. Do you agree?

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

(Y)es/(N)o: Y

 

3.동의

Would you be willing, once your first certificate is successfully issued, to

share your email address with the Electronic Frontier Foundation, a founding

partner of the Let's Encrypt project and the non-profit organization that

develops Certbot? We'd like to send you email about our work encrypting the web,

EFF news, campaigns, and ways to support digital freedom.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

(Y)es/(N)o: Y

 

4.dns txt 설정 hash값 확인

Please deploy a DNS TXT record under the name

_acme-challenge.lottois.info with the following value:



qjbAHdtj.....



Before continuing, verify the record is deployed.

 

5.4번에서 value값을 dns 서버 TXT값으로 입력을 합니다.

6. dig 명령으로 전파가 되었는지 확인해 봅니다.

$ dig -t txt _acme-challenge.[domain]


; <<>> DiG 9.10.6 <<>> -t txt _acme-challenge.[domain]

;; global options: +cmd

;; Got answer:

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 28324

;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1



;; OPT PSEUDOSECTION:

; EDNS: version: 0, flags:; udp: 1232

;; QUESTION SECTION:

;_acme-challenge.[domain]. IN TXT



;; ANSWER SECTION:

_acme-challenge.[domain]. 86400 IN TXT "qjbAHdtj_...."



;; Query time: 93 msec

;; SERVER: 1.1.1.1#53(1.1.1.1)

;; WHEN: Mon Dec 14 13:18:50 KST 2020

;; MSG SIZE rcvd: 113

 

7.확인후 Enter

Press Enter to Continue

Waiting for verification...

Cleaning up challenges

Subscribe to the EFF mailing list (email: [email]).

We were unable to subscribe you the EFF mailing list because your e-mail address appears to be invalid. You can try again later by visiting https://act.eff.org.



IMPORTANT NOTES:

- Congratulations! Your certificate and chain have been saved at:

/etc/letsencrypt/live/lottois.info/fullchain.pem

Your key file has been saved at:

/etc/letsencrypt/live/lottois.info/privkey.pem

Your cert will expire on 2021-03-14. To obtain a new or tweaked

version of this certificate in the future, simply run certbot

again. To non-interactively renew *all* of your certificates, run

"certbot renew"

- If you like Certbot, please consider supporting our work by:



Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate

Donating to EFF: https://eff.org/donate-le

 

8.볼륨 지정 폴더 확인

 

privkey.pem 과 fullchainn.pem가 생성된 것을 확인할 수 있습니다. 

 

3.nginx 적용

위 정보를 nginx에 적용한 설정파일은 하기 fullchain.pem, privkey.pem파일을 활용하여

https로 적용되는것을 확인하였습니다.

http {
    access_log  /var/log/nginx/access.log;
    error_log   /var/log/nginx/error.log;

    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    server {
        listen 80;
        server_name lottois.info;
        return 301 https://$host$request_uri;    
    }
    
    server {
        listen 443 ssl;
        server_name lottois.info;
        ssl_certificate /etc/nginx/cert/fullchain.pem;
    	ssl_certificate_key /etc/nginx/cert/privkey.pem;
        
        ssl_session_cache shared:le_nginx_SSL:1m;
	    ssl_session_timeout 1440m;
	
	    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
	    ssl_prefer_server_ciphers on;
	
	    ssl_ciphers "ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS";
    
        location / {
            proxy_pass         http://lottoweb:8080;
        }    
    }
    
    sendfile        on;
    keepalive_timeout  65;
    include /etc/nginx/conf.d/*.conf;
}

 

'DevOps' 카테고리의 다른 글

[Docker] 네트워크, 컨테이너간 통신  (0) 2020.12.12
[Docker] Dockerfile command  (0) 2020.11.20
[Docker] docker 주요 명령어  (0) 2020.11.20
[nginx] nginx 프록시 설정  (0) 2020.11.17

1. 네트워크 드라이버 종류

$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
f5d0db8f813a        bridge              bridge              local
13d25bc6a925        host                host                local
b1f2996399bf        none                null                local

위와 같이 docker 는 3개의 네트워크를 이용하게 됩니다.

  bridge : 기본 네트워크 드라이버입니다. 드라이버를 지정하지 않은 경우 default bridge를 사용하게됩니다.

  host :  호스트 네트워킹을 직접 사용합니다.

  none : 모든 네트워킹을 비활성화합니다.

 

2. bridge network를 사용하여 테스트해보기

 

하기 두개의 컨테이너를 실행시켜 봅니다

$ docker run -dit --name alpine1 alpine ash
$ docker run -dit --name alpine2 alpine ash

 

실행중인 컨테이너를 확인해 봅니다.

$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
22654255a870        alpine              "ash"               6 seconds ago       Up 5 seconds                            alpine2
55159257b891        alpine              "ash"               15 seconds ago      Up 14 seconds                           alpine1

 

하기 명령으로 기본 네트워크를 지정하지 않았으므로  bridge 네트워크에 연결이 된 것을 확인할 수 있습니다.

$ docker network inspect bridge
...
"Name": "bridge",
...
"IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
 ...
 "Containers": {
            "22654255a8706b9d3ed0efe8b4c2bdf0d99d036910f1205aec5df262a080feb8": {
                "Name": "alpine2",
                "EndpointID": "122a834f82c6675487efe1277e4e074395812cacf57f9ae2fb233d5ed458e4ab",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            },
            "55159257b891c72e810e02ead5b7fedf755f9d5f22d24297de39edc69f54f5d9": {
                "Name": "alpine1",
                "EndpointID": "01d895b00c6f52fa184d130a4413335f083b788a5c10787c779be38edda46348",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            }
        },

 

서로 연동이 잘되기 위하여  alpine1을 연결해 봅니다.

$ docker attach alpine1

//alpine1 -> alpine2로 연결확인 (ok)
# ping -c 2 172.17.0.3
PING 172.17.0.3 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.249 ms
64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.084 ms

//컨테이너 이름으로 연결확인 (ng)
ping -c 2 alpine2
ping: bad address 'alpine2'

 

 

 

3. 서로 컨네이너명으로 연결해 보기 (사용자 정의 브릿지 네트워크 사용)

docker network create --driver bridge alpine-net

 

하기 명령으로 잘 생성된 것을 확인할 수 있습니다.

$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
eb7be8cc8508        alpine-net          bridge              local
f5d0db8f813a        bridge              bridge              local
13d25bc6a925        host                host                local
b1f2996399bf        none                null                local

 

테스트 콘테이너 실행

//두개는 네트워크에 연결하가고 alpinne3은 네트워크 지정없이 기본 네트워크에 연결 
$docker run -dit --name alpine1 --network alpine-net alpine ash
$docker run -dit --name alpine2 --network alpine-net alpine ash
$docker run -dit --name alpine3 alpine ash
$docker run -dit --name alpine4 alpine ash
$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
6058ce3e109e        alpine              "ash"               49 seconds ago      Up 48 seconds                           alpine4
3df2d9c59b55        alpine              "ash"               27 minutes ago      Up 27 minutes                           alpine3
33a086be0054        alpine              "ash"               27 minutes ago      Up 27 minutes                           alpine2
3d88d4a925df        alpine              "ash"               27 minutes ago      Up 27 minutes                           alpine1

 

네트워크 inspect 확인

$docker network inspect bridge
...
"Name": "bridge",
...
"Containers": {
            "3df2d9c59b559d64df58f79d336a5495d1ef01a500a07b8d0b083fd8c15682f9": {
                "Name": "alpine3",
                "EndpointID": "0927f81fa6a69146e3cd75b05932b4d628223f266383d920c513c96943d505a5",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            },
            "6058ce3e109e88e87161f2b780fc18c7f2df4c884ac27e2aafdd958e90794447": {
                "Name": "alpine4",
                "EndpointID": "47248479369fcaba4c2f3f1535e1a7f47b0c5a0847bdc450618ad300b980491e",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            }
        },

...


$docker network inspect alpine-net
...
"Name": "alpine-net",
...
"Containers": {
            "33a086be0054693a5b4500f01264104637a0d3e3c2d89747996d89376754d3fd": {
                "Name": "alpine2",
                "EndpointID": "104deba1e3b9d9391846d8d3ea1dea4b80b7a4fc025aaded62c0d48c97ff5ff5",
                "MacAddress": "02:42:ac:13:00:03",
                "IPv4Address": "172.19.0.3/16",
                "IPv6Address": ""
            },
            "3d88d4a925df434b45f474fd2ff2f81199f738640d013053d0a2a9bdc49d8fa7": {
                "Name": "alpine1",
                "EndpointID": "42d16b7058b6bd136f3d02d4c0c42d61cfe5534d252704dfcd882cf054d01614",
                "MacAddress": "02:42:ac:13:00:02",
                "IPv4Address": "172.19.0.2/16",
                "IPv6Address": ""
            }
        },
...

 

연결 테스트

$ docker container attach alpine1

//alpine2으로 컨테이너 명으로 ping

/ # ping -c 2 alpine2 (ok)

PING alpine2 (172.19.0.3): 56 data bytes

64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.099 ms

64 bytes from 172.19.0.3: seq=1 ttl=64 time=0.088 ms



//alpine3으로 ping

ping -c 2 alpine3 (ng)

ping: bad address 'alpine3'



ping -c 2 172.17.0.2 (ng)

packets transmitted, 0 packets received, 100% packet loss

4. 정리

위 테스트를 그림으로 정리를 다시 하면

 

위 테스트를 통해서

  • 같은 네트워크에 있는 컨테이너간만 통신 가능

  • 사용자가 만든 외부 네트워크를 이용하면 컨테이너 이름으로 연결가능

이러한 이해는 여러 서비스를 연결할때 내부 ip를 매번 확인하면서 할 수 없기 때문에

외부 네트워크를 생성해서 컨테이너 이름으로 연결하는 것을 확인하는 테스트였습니다.

 

 

자세한 내용은 하기 document에서 확인할 수 있습니다.

https://docs.docker.com/network/

 

'DevOps' 카테고리의 다른 글

[Docker] HTTPS Let 's Encrypt 인증서 발급받기  (0) 2020.12.14
[Docker] Dockerfile command  (0) 2020.11.20
[Docker] docker 주요 명령어  (0) 2020.11.20
[nginx] nginx 프록시 설정  (0) 2020.11.17

이미지를 만들기 위하여 Dockerfile를 사용을 합니다. 

Dockerfile내의 주요 명령어를 정리해 보았습니다.

docs.docker.com/engine/reference/builder/

 

Dockerfile reference

 

docs.docker.com

 

Dockerfile 빌드 

build

Dockerfile로부터 이미지 생성
docker build .
docker build -f /path/to/a/Dockerfile .

 

Dockerfile내 명령어

FROM

베이스이미지를 불러옵니다.
FROM [--platform=<platform>] <image> [AS <name>]
ROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
FROM [--platform=<platform>] <image>[@<digest>] [AS <name>]

RUN

RUN <command>
RUN /bin/bash -c 'source $HOME/.bashrc; \
echo $HOME'
RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME'
RUN ["/bin/bash", "-c", "echo hello"]

CMD

CMD ["executable","param1","param2"]

COPY

COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]

ADD

ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]

ENTRYPOINT

컨테이너가 시작되었을때 실행
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2

VOLUME

마운트 포인트를 생성
FROM ubuntu
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol

WORKDIR

도커파일내의 RUN, CMD, ENTRYPOINT, COPY and ADD가 실행되는 위치를 지정
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd

EXPOSE

컨테이너가 listens할 port를 지정
EXPOSE <port> [<port>/<protocol>...]
EXPOSE 80/udp

 

 

1. 도커란 

도커 컨테이너는 일종의 소프트웨어를 소프트웨어의 실행에 필요한 모든 것을 포함하는 완전한 파일 시스템 안에 감싼다. 여기에는 코드, 런타임, 시스템 도구, 시스템 라이브러리 등 서버에 설치되는 무엇이든 아우른다. 이는 실행 중인 환경에 관계 없이 언제나 동일하게 실행될 것을 보증한다.

ko.wikipedia.org/wiki/%EB%8F%84%EC%BB%A4_(%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4)

 

기본 명령어 

모든 자세한 내용은 하기 document문서에서 확인하면 상세정보를 확인할 수 있습니다.

https://docs.docker.com/reference/

 

로그인

docker login [OPTIONS] [SERVER]

 

 

이미지 관련

이미지 찾기

Docker 허브에서 이미지를 검색
docker search [OPTIONS] TERM
docker search busybox

이미지 다운로드

레파지토리에서 이미지를 pull
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
docker pull debian
docker pull debian:jessie

이미지 보기

이미지 리스트를 보여준다.
docker images [OPTIONS] [REPOSITORY[:TAG]]
docker images java
docker images java:8

이미지 실행

이미지에서 새로운 컨테이너를 실행한다.
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker run --name test -it debian

이미지 만들기

Dockerfile로 부터 이미지를 생성
docker build [OPTIONS] PATH | URL | -
docker build http://server/context.tar.gz
docker build -t app .

이미지를 삭제

docker rmi [OPTIONS] IMAGE [IMAGE...]
docker rmi fd484f19954f
docker rmi test2:latest
docker rmi -f fd484f19954f
docker rmi -f $(docker images -a -q)

이미지 히스토리

docker history [OPTIONS] IMAGE
docker history docker

레파지토리에 이미지 올리기

docker push [OPTIONS] NAME[:TAG]
docker push registry-host:5000/myadmin/rhel-httpd

 

컨테이너 관련

컨테이너 정지

docker stop [OPTIONS] CONTAINER [CONTAINER...]
docker stop my_container

컨테이너 시작

docker start [OPTIONS] CONTAINER [CONTAINER...]
docker start my_container

컨테이너 종료

docker kill [OPTIONS] CONTAINER [CONTAINER...]
docker kill my_container

컨테이너 확인

컨테이너 리스트를 보여준다
docker ps [OPTIONS]
docker ps -a

컨테이너 삭제

docker rm [OPTIONS] CONTAINER [CONTAINER...]
docker rm /redis
docker rm --force redis
docker rm $(docker ps -a -q)

컨테이너 명령

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
docker exec -it ubuntu_bash bash
docker exec -it ubuntu_bash pwd

볼륨 생성

docker volume create [OPTIONS] [VOLUME]
$ docker volume create hello
hello
$ docker run -d -v hello:/world busybox ls /world

이미지 정보 보기

docker inspect [OPTIONS] NAME|ID [NAME|ID...]
docker inspect --format='{{.Config.Image}}' $INSTANCE_ID

 

'DevOps' 카테고리의 다른 글

[Docker] HTTPS Let 's Encrypt 인증서 발급받기  (0) 2020.12.14
[Docker] 네트워크, 컨테이너간 통신  (0) 2020.12.12
[Docker] Dockerfile command  (0) 2020.11.20
[nginx] nginx 프록시 설정  (0) 2020.11.17

nginx 란 ?

www.nginx.com/resources/glossary/nginx/

NGINX 는 웹 서비스, 리버스 프록시, 캐싱,로드 밸런싱, 미디어 스트리밍 등을위한 오픈 소스 소프트웨어입니다. 
최고의 성능과 안정성을 위해 설계된 웹 서버로 시작되었습니다. 
HTTP 서버 기능 외에도 NGINX는 이메일 (IMAP, POP3 및 SMTP) 용 프록시 서버와 HTTP, TCP 및 
UDP 서버용 역방향 프록시 및로드 밸런서로도 작동 할 수 있습니다.

 

저는 nginx를 웹 프록시 서버로 접근시 톰켓 서버로 연동 되도록 설정해 보겠습니다.

자세한 내용은 하기 내용들을 참고하면 될 것 같습니다.

https://nginx.org/en/docs/beginners_guide.html

https://docs.nginx.com/nginx/admin-guide/load-balancer/http-load-balancer/#proxying-http-traffic-to-a-group-of-servers

 

1. nginx.conf 설정

nginx설치 후 nginx.conf 파일을 하기와 같이 8080으로 받으면 내부 9090포트로 전달하도록 설정하였습니다.

server {
        listen       8080;
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;

        location / {
            proxy_set_header    Host $http_host;
            proxy_set_header    X-Real-IP $remote_addr;
            proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header    X-Forwarded-Proto $scheme;
            proxy_set_header    X-NginX-Proxy true;

            proxy_pass http://127.0.0.1:9090;
            proxy_redirect      off;
            charset utf-8;
         }
...

2. nginx 재 시작 

위 설정 후 nginx restart 8080으로 접근하면 정상적으로 동작하는 것을 확인하였습니다.

+ Recent posts