Nginx 이미지 생성하기

|

nginx

nginx는 가볍고 실용적인 웹서버입니다. 웹서버, 리버스 프록시, 메일 프록시 등의 기능을 갖고 있습니다.


ngix 이미지 생성하기

nginx 이미지 생성용 Dockerfile은 여기에서 확인할 수 있습니다.

FROM ubuntu:latest

# Install Nginx.
RUN apt-get update
RUN apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
RUN chown -R www-data:www-data /var/lib/nginx

# Define mountable directories.
VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"]

# Define working directory.
WORKDIR /etc/nginx

# Define default command.
CMD ["nginx"]

# Expose ports.
EXPOSE 80
EXPOSE 443

위와 같은 Dockerfile을 생성하고 해당 폴더에서 아래 명령어를 이용해서 nginx 이미지를 빌드할 수 있습니다.

$ docker build --tag snow-nginx:0.1 .

Sending build context to Docker daemon  2.048kB
Step 1/10 : FROM ubuntu:latest
latest: Pulling from library/ubuntu
1be7f2b886e8: Pull complete
6fbc4a21b806: Pull complete
c71a6f8e1378: Pull complete
4be3072e5a37: Pull complete
06c6d2f59700: Pull complete
Digest: sha256:e27e9d7f7f28d67aa9e2d7540bdc2b33254b452ee8e60f388875e5b7d9b2b696
Status: Downloaded newer image for ubuntu:latest
 ---> 0458a4468cbc
Step 2/10 : RUN apt-get update
 ---> Running in 5ff5327e54cb

...

Step 9/10 : EXPOSE 80
 ---> Running in da53118109a4
Removing intermediate container da53118109a4
 ---> 395dc7dc3371
Step 10/10 : EXPOSE 443
 ---> Running in 3f8c3f9a8895
Removing intermediate container 3f8c3f9a8895
 ---> a935dd536d8e
Successfully built a935dd536d8e
Successfully tagged snow-nginx:0.1


빌드된 이미지 확인은 docker images로 확인할 수 있습니다.

$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
snow-nginx          0.1                 a935dd536d8e        58 seconds ago      208MB

Scratch 이미지 생성하기

|

Scratch 이미지 생성하기

Docker에서 아무 것도 들어있지 않은 비어있는 베이스 이미지를 scratch 이미지라고 합니다.

dev/null 장치를 이용해서 비어있는 tar 파일을 docker import하면 scratch 이미지가 생성됩니다.

$ tar cv --files-from /dev/null | sudo docker import - scratch

$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
scratch             latest              8a0ef0f0a9b8        6 seconds ago       0B


Scratch 이미지에 프로그램 추가하기

scratch 이미지는 비어있는 이미지이기 때문에 컨테이너 생성이 되지 않습니다. 여기에 프로그램을 하나 추가해보도록 하겠습니다.

아래의 코드와 같이 간단한 C++ 프로그램을 작성합니다.

#include 

using namespace std;

int main() {
    printf("Hello. SnowDeer.\n");
    
    return 0;
}
</pre>

scratch 이미지에는 아무 라이브러리도 없기 때문에 빌드할 때는 반드시 정적(static) 바이너리로 빌드해야합니다.

~~~
$ g++ hello.cpp -static -o hello
~~~


## Dockerfile 생성 그리고 Dockerfile을 아래와 같이 작성합니다.
FROM scratch
ADD ./hello /hello
CMD ["/hello"]
그런 다음 `docker build` 명령을 수행합니다. ~~~ $ docker build --tag hello:0.1 . Sending build context to Docker daemon 1.83MB Step 1/3 : FROM scratch ---> Step 2/3 : ADD ./hello /hello ---> Using cache ---> 0d32a1e91f48 Step 3/3 : CMD ["/hello"] ---> Running in 84a81208a7a9 Removing intermediate container 84a81208a7a9 ---> 13ea232f71c9 Successfully built 13ea232f71c9 Successfully tagged hello:0.1 ~~~ 이미지 생성 결과 확인은 다음과 같습니다. ~~~ $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello 0.1 13ea232f71c9 46 seconds ago 913kB scratch latest 8a0ef0f0a9b8 7 minutes ago 0B ~~~ 컨테이너로 실행을 해봅니다. ~~~ $ docker run --rm hello:0.1 Hello. SnowDeer. ~~~

Ubuntu 베이스 이미지 생성하기

|

Ubuntu 베이스 이미지 생성하기

Ubuntu 베이스 이미지를 생성하기 위해서는 먼저 우분투 리눅스용 부트스트랩 바이너리 파일들을 받아와야 합니다.


debootstrap 설치

부트스트랩 툴인 debootstrap를 호스트 PC에서 설치합니다.

$ sudo apt-get install debootstrap


Ubuntu 바이너리 파일 다운로드

위에서 받은 debootstrap 프로그램을 이용해서 Ubuntu 바이너리를 다운로드합니다. 다운로드할 때 Ubuntu의 코드네이(Codename)이 필요한데 여기에서 확인할 수 있습니다.

저는 16.04 LTS 버전인 xenial로 다운로드했습니다. debootstrap <code name> <directory name> 입니다.

$ sudo debootstrap xenial xenial


docker import 명령어로 베이스 이미지 생성

$ sudo tar -C xenial -c . | sudo docker import - xenial

sha256:15a945ebf05d877bd5e7e1ec92e8c65726bbed5a46525bf023cda42e29da3502

이제 베이스 이미지가 생겼고, 컨테이너를 실행해서 확인을 해봅니다.

$ docker run -i -t --name hello xenial /bin/bash

root@dcfe551d2c01:/# cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04 LTS"

Docker Local Repository 사용하는 방법

|

Docker Local Repository 사용하는 방법

현재 사용하는 PC에 Docker Local Repository를 구성하고 싶으면 아래의 방법대로 하시면 됩니다.

Docker init.d 파일 수정

먼저 Docker 서비스를 종료합니다.

$ sudo service docker stop

그 이후 /etc/init.d/docker 파일을 편집기로 열어서 DOCKER_OPTS 항목에 아래 내용을 추가해줍니다.

DOCKER_OPTS=--insecure-registry localhost:5000

그런 다음 Docker 서비스를 다시 실행합니다.

$ sudo service docker restart


Registry Server 이미지 다운로드

Docker Registry 서버도 Docker Hub에서 이미지로 배포하고 있습니다. 다음 명령어로 Registry 이미지를 다운로드합니다.

$ docker pull registry:latest


Registry 컨테이너 실행

로컬 PC의 `/home/snowdeer/Docker/registry’ 폴더를 컨테이너에 연결시켰습니다.

docker run -d -p 5000:5000 --name snowdeer-registry -v /home/snowdeer/Docker/registry:/tmp/registry registry


로컬 Registry에 Docker 이미지 올리기

먼저 commit 명령어를 이용해서 Docker 이미지를 간단하게 만들어봅니다.

$ docker run --name snow-nginx nginx

$ docker commit -m "Snow Nginx" snow-nginx snow-nginx:0.1

그런 다음 위에서 만들었던 로컬 Registry에 해당 이미지를 push 명령어를 이용해서 업로드합니다.

$ docker tag snow-nginx:0.1 localhost:5000/snow-nginx:0.1

$ docker push localhost:5000/snow-nginx:0.1

The push refers to repository [localhost:5000/snow-nginx]
fced5b294318: Pushed 
a103d141fc98: Pushed 
73e2bd445514: Pushed 
2ec5c0a4cb57: Pushed 
0.1: digest: sha256:6e7f42cb6b7df0c8a4cbd75d0fbecefcafdcc6c0d95bb4e07a19c05ef19e5171 size: 1155

태그를 생성하는 명령은 docker tag <image name>:<tag> <Docker registry URL>/<image name>:<tag> 입니다.

이미지 업로드는 docker push <Docker registry URL>/<image name>:<tag> 입니다.

개인이 만든 Registry에 이미지를 올릴 때는 먼저 태그를 생성해야 하며, 그 이후 push 명령을 사용할 수 있습니다.


로컬 Registry의 이미지 리스트 조회

로컬 Registry의 이미지도 docker images 명령을 이용해서 조회할 수 있습니다.

$ docker images

REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
localhost:5000/snow-nginx   0.1                 e3fc966b1d25        5 minutes ago       108MB
snow-nginx                  0.1                 e3fc966b1d25        5 minutes ago       108MB
ubuntu                      latest              0458a4468cbc        11 days ago         112MB
wordpress                   latest              e8cebf03929c        2 weeks ago         407MB
mysql                       latest              f008d8ff927d        3 weeks ago         409MB
registry                    latest              d1fd7d86a825        3 weeks ago         33.3MB
nginx                       latest              3f8a4339aadd        5 weeks ago         108MB


로컬 Registry의 이미지 다운로드

$ docker pull localhost:5000/snow-nginx:0.1


로컬 Registry의 이미지 삭제

$ docker rmi localhost:5000/snow-nginx:0.1

우분투(Ubuntu)에서 Snap Package 사용하기

|

Snap Package

우분투에 기본 내장된 Ubuntu Software를 이용해서 프로그램들을 설치하려고 했을 때 아래와 같은 오류가 발생하는 경우가 있습니다.

image

Detailed errors from the package manager follow:

snapd returned status code 400: Bad Request

Linux가 Ubuntu, Fedora, Debian 등 다양한 형태로 파편화가 되어 있고, 프로그램 설치 파일 형태도 제각각이기 때문에 Universal Package로 만들려는 시도가 있었습니다. 그러다가 우분투에서는 ‘Snap’이라는 이름의 Universal Package를 런칭했습니다. 당연히 ‘Snap’은 다른 리눅스에서도 설치가 가능했습니다. 작년 초에 Snap 2.20을 릴리즈했고, 기존에 사용하던 App인 ‘Software Center’에서는 아직 지원이 안되고 있습니다. 그래서 현재는 Snap을 사용하려면 터미널에서 커맨드 입력으로 사용해야 합니다.


Snap 사용법

다음과 같은 형태로 사용하면 됩니다.

Store의 프로그램 검색

$ snap find <text to search>

ex) snap find "visual studio code"

위 명령어를 입력하면 ‘Visual Studio Code’에 대한 정보가 나오고 패키지명과 Class Snap 여부를 확인할 수 있습니다.


프로그램 설치

image

따라서 위와 같은 경우는 아래 명령어를 이용해서 프로그램을 설치할 수 있습니다.

$ snap install <snap name>

ex) sudo snap install vscode --classic


프로그램 업데이트

만약 기존에 설치한 프로그램을 업데이트하고 싶을 때는 refresh 옵션을 이용하면 됩니다.

$ snap refresh <snap name>


모든 프로그램 업데이트

모든 프로그램을 업데이트할 경우엔 다음 명령어를 입력합니다.

$ sudo snap refresh


프로그램 삭제

$ sudo snap remove <snap name>