도커의 오브젝트는 크게 Images와 Containers로 구성된다.
이미지는 도커를 사용하여 특정 환경을 구성해놓은 템플릿이다.
이러한 이미지를 인스턴트화하여 실행가능한 상태로 만든 것이 컨테이너이다.

도커 이미지는 도커 허브와 같은 공개 저장소나 사설 서버에 저장할 수 있다. 도커 이미지를 만들때는 Dockerfile에 구체적인 설정을 작성한 후 만들수 있다.
Docekr Hub에 존재하는 이미지를 다운받아 파일을 추가해 나만의 이미지를 만들 수 있다.
Ubuntu 이미지를 받고 텍스트 파일을 추가해 새로운 이미지를 만들어보자
docker run -i -t --name my_ubuntu ubuntu
먼저 호스트에서 my_ubuntu 이미지를 만들어 접속한다. 그리고 "my_ubuntu"라는 문자열이 담긴 test 파일을 만들고 다시 호스트로 돌아온다.
echo my_ubuntu >> test
exit
그 후 만든 이미지를 commit하고 images 목록을 확인해 보면 my_ubuntu라는 이름의 이미지가 생긴것을 확인할 수 있다.
docker commit -a "my_ubuntu_writer" -m "my ubuntu first commit" my_ubuntu my_ubuntu:first
docker images
방금 전에 Ubuntu 이미지를 다운받아 파일을 하나 추가해 my_ubuntu:first라는 이미지를 만들었다. 두 개의 이미지를 inspect 명령어를 사용해 Layers 부분을 보면 다음과 같다.
위에가 ubuntu이고 밑에가 my_ubuntu이다.
좀 더 이해하기 쉽게 그림으로 나타내면 아래와 같다

새로운 이미지를 만들 때 기존 이미지에서 변경사항 부분을 레이어로 만들어 해쉬 형태로 저장하는 방식이다.
export, import 명령어를 사용하면 방금 만든 이미지 또는 컨테이너를 바이너리 파일로 만드는 것이 가능합니다.
직접 만든 이미지를 배포할 수도 있습니다. 위와 같이 바이너리 파일로 만들수 도 있지만 레이어 형태가 아닌 단일 파일로 저장하므로 비효율적입니다. 그래서 보통은 도커 허브와 도커 사설 레지스트리 이렇게 크게 2가지 방법으로 배포를 합니다.
도커에서 공식적으로 운영하는 도커 허브 이미지 저장소이다. 우리가 다운받은 Ubuntu와 같은 이미지들은 여기에 저장되어 있다.
도커 허브에 이미지를 올리기 위해서는 유저의 이름으로 시작을 해서 hub-user/repo-name[:tag]와 같은 형태가 되어야 한다. tag는 아무것도 입력하지 않은 경우 lastest가 된다. 먼저 docker login으로 계정인증을 하고 나만의 이미지를 만든다. 그리고 docker hub에 올릴 저장소를 만든다
ubuntu 이미지를 실행하고 test라는 파일을 작성한 후 이를 새로운 이미지로 만든다.
docker run -i -t --name my_container ubuntu
echo my_docker_hub_ubuntu >> test
exit
# my_container라는 컨테이너를 만들고 test파일을 하나 만들고 호스트로 돌아온다.
docker commit my_container cockerer/my_docker_hub_ubuntu
docekr push cockerer/my_docker_hub_ubuntu
# 위에서 만든 컨테이너를 docker hub에 올릴 cockerer/my_docker_hub_ubuntu라는 이름의 이미지로 commit한 후 docker hub에 push한다
실제 docker hub 저장소에 push가 된 것을 확인할 수 있다.
이제 docker hub에서 해당 이미지를 받아 test 파일이 존재하는지 확인해보자. 먼저 존재하는 이미지와 컨테이너를 전부 지운다.
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
docker rmi -f $(docker images -q)
그리고 아까 만든 이미지를 실행시킨후 test 파일을 확인한다.
파일이 존재하는 것을 확인할 수 있다.
도커 허브에는 그 밖에도 여러 사람들이 함께 쓸 수 있는 Organizations 기능도 있다.
직접 서버에 구축하는 방식도 있지만 Azure의 ACI나 AWS의 ECS를 이용하면 더 편리하게 구축할 수 있다.