1. Docker的一些基础废话
Docker是一个开源的应用容器引擎,用户可以打包自己的应用以及依赖包到一个镜像(images)中,将images开源。
其他用户download image后,进行部署deploy,在容器(container)中运行。
容器(container)使用机箱机制,之间不会有接口(PS. 可用Volume进行数据db的共享),且有各自的IP Addess。
它利用了LXC(Linux Containers)、Cgroups、linux内核,为进程提供了轻量级的虚拟环境。
2. Already Installed docker-ce
$ sudo docker version # get the version of the docker, include cli and server
Client:
Version: 17.03.1-ce
API version: 1.27
Go version: go1.7.5
Git commit: c6d412e
Built: Mon Mar 27 17:10:36 2017
OS/Arch: linux/amd64
Server:
Version: 17.03.1-ce
API version: 1.27 (minimum version 1.12)
Go version: go1.7.5
Git commit: c6d412e
Built: Mon Mar 27 17:10:36 2017
OS/Arch: linux/amd64
Experimental: false
I can pull images from the repo docker hub
$ sudo docker pull buaapengbo/docker-whale # pull images
$ sudo docker images # check the images downloaded
deploy a container using the images
$ sudo docker run [flag] buaapengbo/docker-whale [command arg]
[flag]
-it # i(stdio) t(tty)
-v /local/date:/container/date # volume date to share
--name XX # the container name
-d # detached mode
--rm # remove the volume when delete the container
--volumes-from [containername] # share volumes with other container
-P # random port to the host
-p # 8888:80 specific container port(8888) to the host port(80)
$ sudo docker ps # check the running container
$ sudo docker ps -a # check all the container
$ sudo docker stop [container ID/NAME] # stop the container
$ sudo docker rm [container ID/NAME] #remove the container
$ sudo docker rmi [images ID/NAME] # remove the images
3. Docker的文件系统等(包括Volume)
a) Docker镜像由多个只读层组成,启动容器,会加载只读层,并在其之上构建读写层。
b) 运行中的容器,会将只读层的文件复制到读写层之后进行修改,只读文件未变。
c) 只读层 + 读写层 = 联合文件系统(Union File System)
而Volume绕过UFS, -v [宿主机]:[容器]
Volume
$ sudo docker run -it --name volume_test -v /date alpine /bin/sh
利用alpine镜像进行部署,container名字为volume_test,在container中有volume_test的文件夹,为container和host公用,为查看volume的在宿主机host的位置:
$ sudo docker inspect -f {{.Volumes}} volume_test # 可以得到volume在host端的位置,该文件夹中date为两者共享
也可以指定volume的位置:
$ sudo docker run -it --name volume_test2 -v /local/date:/date alpine /bin/sh
local/data为host端的文件夹,date为container端文件夹,两者共享文件。
(1) 数据共享
$ sudo docker run -it --volumes-from volume_test --name share_volume_test alpine /bin/sh
(2) 数据容器
使用纯数据容器来持久化数据库。
$ sudo docker run --name dbdate postgres echo "From postgres"
$ sudo docker run -d --volumes-from dbdate --name db1 postgres
(3) 备份
$ sudo docker run -rm --volumes-from dbdate -v $(pwd):/backup debian tar cvf /backup/backup.tar /var/lib/postgresql/data
该示例应该会将Volume里所有的东西压缩为一个tar包(官方的postgres Dockerfile在/var/lib/postgresql/data目录下定义了一个Volume)
(4) 删除
$ sudo docker rm -v [container ID/NAME]
or
$ sudo docker run -rm ... # when start a container