26 Jan 2018
|
Docker
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
25 Jan 2018
|
Docker
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.
~~~
25 Jan 2018
|
Docker
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"
24 Jan 2018
|
Docker
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
22 Jan 2018
|
리눅스 설정
Ubuntu
Snap Package
우분투에 기본 내장된 Ubuntu Software
를 이용해서 프로그램들을 설치하려고 했을 때 아래와 같은 오류가 발생하는 경우가 있습니다.

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 여부를 확인할 수 있습니다.
프로그램 설치

따라서 위와 같은 경우는 아래 명령어를 이용해서 프로그램을 설치할 수 있습니다.
$ snap install <snap name>
ex) sudo snap install vscode --classic
프로그램 업데이트
만약 기존에 설치한 프로그램을 업데이트하고 싶을 때는 refresh
옵션을 이용하면 됩니다.
$ snap refresh <snap name>
모든 프로그램 업데이트
모든 프로그램을 업데이트할 경우엔 다음 명령어를 입력합니다.
프로그램 삭제
$ sudo snap remove <snap name>