backend/docker

docker images 기본 명령어 및 기초설명

seul chan 2017. 12. 16. 03:13

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

를 보면 REPOSITORYTAGIMAGE 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를 입력해보면 여러 명령어중 loginlogout이 있다. 이를 활용해서 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만이 가진 고유한 문법
  1. FROM
    FROM debian:jessie
    
  2. ENV

  3. RUN command
    • install software, file edit etc… inside container
    • &&으로 각각의 명령어 구분 (한 layer 안에서)
  4. EXPOSE

  5. 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