1、查看版本
# docker version
2、镜像
获取镜像
# docker pull #默认从Docker Hub镜像源
# docker pull hub.c.163.com/public/ubuntu:14.04 #从网易获取
查看镜像信息
# docker images
添加镜像标签
# docker tag ubuntu:latest myubuntu:latest
查看镜像详细信息
# docker inspect ubuntu:14.04
# docker inspect -f {{".Architecture"}} #获取镜像的Architecture
查看镜像历史
# docker history ubuntu:14.04
搜索镜像
# docker search nginx
删除镜像
# docker rmi myubuntu:latest #-f可强制删除
创建镜像
# docker run -it ubuntu:14.04 /bin/bash
root@a925cb40b3f0:/# touch test
root@a925cb40b3f0:/# exit
# docker commit -m "Added a new file" -a "Docker Newbee" a925cb40b3f0 test:0.1
9e9c814023bcffc3e67e892a235afe61b02f66a947d2747f724bd317dda02f27
# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
test 0.1 9e9c814023bc 4 seconds ago 188 MB
操作系统模板文件导入镜像
# cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04
导出和导入镜像
# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.04 8f1bd21bd25c 2 weeks ago 188 MB
...
# docker save -o ubuntu_14.04.tar ubuntu:14.04
# docker load --input ubuntu_14.04.tar或# docker load < ubuntu_14.04.tar
上传镜像
# docker tag test:latest user/test:latest
# docker push user/test:latest
The push refers to a repository [docker.io/user/test]
Sending image list
Please login prior to push:
Username:
Password:
Email:
3、容器
新建容器
# docker create -it ubuntu:latest
af8f4f922dafee22c8fe6cd2ae11d16e25087d61f1b1fa55b36e94db7ef45178
# docker ps -a
启动容器
# docker start af
af
# docker ps -a
新建并启动容器
# docker run ubuntu /bin/echo 'Hello world' #执行完毕后容器被自动终止
Hello world
# docker run -it ubuntu:14.04 /bin/bash #允许用户交互
root@af8bae53bdd3:/#
终止容器
# docker stop ce5
进入容器
# docker attach ce5
# docker exec -it ce5 /bin/bash
# docker run -idt ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds
nostalgic_hypatia
# PID=$(docker-pid 243c32535da7)
10981
# nsenter --target 10981 --mount --uts --ipc --net --pid #通过nsenter命令进入容器
root@243c32535da7:/#
删除容器
# docker rm 243 #-f可以直接删除在运行的容器
导出和导入容器
# docker export -o test_for_run.tar ce5或# docker export ce5 >test_for_stop.tar
# docker import test_for_run.tar - test/ubuntu:v1.0
4、仓库
搭建本地仓库:参考Kubernetes简易搭建(无证书RPM版)Dashboard部署
5、数据管理
(1)数据卷(Data Volumes):容器内数据直接映射到本地主机环境
-P是将容器服务暴露的端口,是自动映射到本地主机的临时端口
-v标记也可以指定挂载一个本地的已有目录到容器中去作为数据卷
例1:使用training/webapp镜像创建一个web容器,并创建一个数据卷挂载
到容器的/webapp目录
# docker run -d -P --name web -v /webapp training/webapp python app.py
例2:加载主机的/ src/webapp目录到容器的/ opt/webapp目录
# docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
例3:Docker挂载数据卷的默认权限是读写(rw),用户也可以通过ro指定为只读
# docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py
例4:从主机挂载单个文件到容器中作为数据卷(不推荐)
# docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash #可以记录在容器输入过的命令历史
(2)数据卷容器(Data Volume Containers):使用特定容器维护数据卷
如果用户需要在多个容器之间␀享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,但是它的目的是专门用来提供数据卷供其他容器挂载
# docker run -itd -v /dbdata --name dbdata centos
# docker run -itd --volumes-from dbdata --name db1 centos #使用--volumes-from参数所挂载数据卷的容器自身并不需要保持在运行状态
# docker run -itd --volumes-from dbdata --name db2 centos
# docker exec -it dbdata /bin/bash
[root@65187e5ee777 /]# ls
bin dbdata dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@65187e5ee777 /]# cd dbdata/
[root@65187e5ee777 dbdata]# ls
[root@65187e5ee777 dbdata]# touch 1.txt
[root@65187e5ee777 dbdata]# exit
exit
# docker exec -it db1 /bin/bash
[root@df495a5b13d4 /]# cd dbdata/
[root@df495a5b13d4 dbdata]# ls
1.txt
(3)利用数据卷容器来迁移数据
备份
# docker run --volumes-from dbdata -v $(pwd):/backup --name worker centos tar cvf /backup/backup.tar /dbdata
恢复
# docker run -itd -v /dbdata --name dbdata2 centos /bin/bash
# docker exec -it dbdata2 /bin/bash
[root@66141fcd5c64 /]# cd dbdata/
[root@66141fcd5c64 dbdata]# ls
# docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
# docker exec -it dbdata2 /bin/bash
[root@66141fcd5c64 /]# cd dbdata/
[root@66141fcd5c64 dbdata]# ls
1.txt
6、时间同步
root@a7df73c35fc3:/opt/webapp# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
root@a7df73c35fc3:/opt/webapp# exit
# docker restart a7d
# docker exec -it a7d /bin/bash
root@a7df73c35fc3:/opt/webapp# date
Mon Sep 7 10:23:48 CST 2020
7、端口映射与容器互联
(1)从外部访问容器应用
通过- P或-p参数来指定端口映射。当使用-P(大写的)标记时,Docker会随机映射一个49000~49900的端口到内部容器开放的网络端口
# docker ps -a|grep webapp
a7df73c35fc3 training/webapp "python app.py" About an hour ago Up About an hour 0.0.0.0:32771->5000/tcp web
[root@master ~]# curl 10.254.8.2:5000 #访问docker ip的5000端口
Hello world![root@master ~]# curl 192.168.120.162:32771 #访问宿主机的32771端口
Hello world![root@master ~]#
# docker logs -f a7d
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
10.254.8.1 - - [07/Sep/2020 14:17:51] "GET / HTTP/1.1" 200 -
192.168.120.162 - - [07/Sep/2020 14:18:02] "GET / HTTP/1.1" 200 -
(2)映射所有接口地址
# docker run -d -p 5000:5000 training/webapp python app.py
# docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py #绑定所有地址的多端口
(3)映射到指定地址的指定端口
# docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
(4)映射到指定地址的任意端口
# docker run -d -p 127.0.0.1::5000 training/webapp python app.py
# docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py #使用udp标记来指定udp端口
(5)查看映射端口配置
# docker port a7d
5000/tcp -> 0.0.0.0:32771
(6)容器互联
–link参数的格式为-- link name:alias,其中name是要连接的容器名
称,alias是这个连接的别名
# docker run -d --name db training/postgres #创建一个新的数据库容器
# docker run -d -P --name web --link db:db training/webapp python app.py #创建一个新的web容器
# docker ps
# docker run --rm --name web2 --link db:db training/webapp env
# docker run -t -i --rm --link db:db training/webapp /bin/bash
root@aed84ee21bde:/opt/webapp# cat /etc/hosts
root@aed84ee21bde:/opt/webapp# ping db