Docker image
Docker hub 사용하기
docker hub에 가입하면, 원하는 이미지를 검색할 수 있다. nginx
로 검색하면 무려 20000개가 넘는 repository들이 있다. 대개는 official 이미지들을 사용할 수 있다. 시작할 때는 official 이미지로 시작해서 원하는 부분을 customizing 하여 자신의 image를 만드는게 좋음
official docker image를 눌러서 들어가보면 stable하게 관리되고 있는 버전들과 다양한 설명들을 볼 수 있다.
downloading, using images
$docker image <sub_command>
로 docker image 관련된 명령어를 실행 가능하다. docker image --help
로 가능한 명령어들을 확인 가능
# 현재 있는 image들 보기
$docker image ls
# docker image 받기
# $docker image pull <image_name>:<version>
# version을 명시하지 않으면 default로 latest 버전이 받아짐
$docker image pull nginx
$docker image pull nginx:1
$docker image pull nginx:1.13
version을 명시하지 않고 latest로 받아도 무방하지만 production 레벨에서는 가능하면 version을 명시해 주는 것이 좋다. (협업, 관리 등의 문제로)
Image layer
docker 공식문서에 나온 layer 설명 We’ve already seen that Docker images are read-only templates from which Docker containers are launched. Each image consists of a series of layers. Docker makes use of union file systems to combine these layers into a single image. Union file systems allow files and directories of separate file systems, known as branches, to be transparently overlaid, forming a single coherent file system.
docker history
란?
image layer를 보여줌.
- image: read-only,
- container: running proecss, 해당 image와 다른 것만 저장? image의 read/write layer이기 때문에 용량이 매우 적다.
# layer의 history를 확인
$docker image history nginx
# ngixn image의 metadata (port, cmd 등...)
$docker image inspect nginx
Image tags
docker image에는 기본적으로 이름이 없다.
# image tag 도움말 확인
$docker image tag --help
$docker image ls
를 보면 REPOSITORY
, TAG
, IMAGE ID
등의 정보를 확인할 수 있다. official인 경우에는 organizatinon name/username이 없이 repository name만 있다.
- tag는 특정 이미지 커밋을 가르키는 pointer의 역할
- docker nginx 페이지에서
latest
와 이와 똑같은mainline
을 받아보면 캐싱 처리가 되어 빠르게 받아진다.docker image ls
로 확인해보면 서로 다른 이미지가 있는 것을 볼 수 있지만,IMAGE ID
가 정확히 같은 것을 확인할 수 있다. ``` $docker image pull nginx:latest $docker image pull nginx:mainline
$docker image ls
두개의 IMAGE ID가 같은것을 볼 수 있다.
REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest f895b3fb9e30 2 days ago 108MB nginx mainline f895b3fb9e30 2 days ago 108MB
### Upload image to docker hub
```bash
# nginx 이미지 이름 변경
$docker image tag nginx bartkim0426/nginx
$docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
bartkim0426/nginx latest f895b3fb9e30 2 days ago 108MB
nginx latest f895b3fb9e30 2 days ago 108MB
bartkim0426/nginx
라는 REPOSITORY가 생긴 것을 볼 수 있다. 이를 docker hub에 올려보면,
# git과 비슷하게 push 명령어로 올릴 수 있다
$docker image push bartkim0426/nginx
denied: requested access to the resource is denied
라는 오류가 뜬다. 아직 docker hub에 로그인하지 않았기 때문.
docker command를 입력해보면 여러 명령어중 login
, logout
이 있다. 이를 활용해서 login 해주면 됨
$docker
...
login Log in to a Docker registry
logout Log out from a Docker registry
...
$docker login --help
# login --help 도움말
Usage: docker login [OPTIONS] [SERVER]
Log in to a Docker registry
Options:
-p, --password string Password
--password-stdin Take the password from stdin
-u, --username string Username
위의 설명처럼 안하고 docker login
만 하면 username, password를 입력하는 promp 창이 뜬다.
# docker login만 입력하면 된다.
$docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username:
Password:
이제 로그인을 했으니 image가 정상적으로 push
되는것을 볼 수 있따.
$docker image push bartkim0426/nginx
docker hub를 확인하면 push한 이미지가 있는것을 확인 가능하다.
만들어진 docker image에 태그 붙이기
$docker image bartkim0426/nginx bartkim0426/nginx:testing
$docker image ls
# 이제 세개의 같은 IMAGE ID를 가진 nginx repository를 볼 시 있다.
REPOSITORY TAG IMAGE ID CREATED SIZE
postgres latest ec61d13c8566 2 days ago 287MB
bartkim0426/nginx latest f895b3fb9e30 2 days ago 108MB
bartkim0426/nginx testing f895b3fb9e30 2 days ago 108MB
nginx latest f895b3fb9e30 2 days ago 108MB
# 이를 올려주면 이제 docker hub안 repository에서 Tags가 두개 있는걸 볼 수 있다.
$docker image push bartkim0426/nginx:testing
Running docker image
- dockerfile: docker만이 가진 고유한 문법
- FROM
FROM debian:jessie
ENV
- RUN command
- install software, file edit etc… inside container
&&
으로 각각의 명령어 구분 (한 layer 안에서)
EXPOSE
- CMD
Build image
- Usage:
docker image build [OPTIONS] PATH | URL | -
$docker image build -t customnginx .
# image 가 잘 만들어졌는지 확인
$docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
customnginx latest ede52bfc69da 40 minutes ago 108MB
Dockerfile commands
FROM
: docker iamge에서 inherit (ENV
는 상속되지 않음)하여 container로.WORKDIR
: 작업할 directory가 바뀌면 복잡해지므로 workdir 사용하는게 좋음COPY
: server에서 container로 입력하기
nginx html example
우선 Dockerfile과 같은 디렉토리에 index.html
을 생성한 후 아무 내용이나 넣는다. (<h1>Hello world</h1>
)
그리고 다음 내용으로 Dockerfile
을 작성
# this same shows how we can extend/change an existing official image from Docker Hub
FROM nginx:latest
# highly recommend you always pin versions for anything beyond dev/learn
WORKDIR /usr/share/nginx/html
# change working directory to root of nginx webhost
# using WORKDIR is prefered to using 'RUN cd /some/path'
COPY index.html index.html
# I don't have to specify EXPOSE or CMD because they're in my FROM
작성한 내용을 바탕으로 docker image 생성 후 띄워보기
# build dockerfile
# -t 는 태그 입력, .는 현재 경로
$docker image build -t nginx-with-html .
# build된 이미지 확인
$docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx-with-html latest a5e546a0134b 5 hours ago 108MB
# build한 이미지를 바탕으로 run
$docker container run -p 80:80 --rm nginx-with-html
이후 localhost
에 접속하면 만들어 놓은 template이 뜨는걸 볼 수 있다.
Tags:
'backend > docker' 카테고리의 다른 글
build node image in docker (0) | 2017.12.18 |
---|---|
Docker - django 2.0 runserver 띄워보기 (0) | 2017.12.18 |
Docker networks (0) | 2017.12.15 |
Docker basic commands - Container (0) | 2017.12.14 |
docker 소개: 버전 소개 및 mac에 설치 (0) | 2017.12.13 |