--------------------------------
Author : ShawnDong
updateDate :2019.12.22
Blog : ShawnDong98.github.io
--------------------------------
概念
Docker系统有两个程序:docker服务端和docker客户端。
docker服务端是一个服务进程,管理着所有的容器。
docker客户端则扮演着docker服务端的远程控制器,可以用来控制docker的服务端进程。
容器和镜像的区别
我的理解是容器是还没成型的镜像。
我们不断向容器里添加内容,当容器环境配置好了以后,进行打包,打包好的容器就叫镜像。
在容器中安装程序以及进入容器
docker run learn/tutorial apt-get install -y ping
出现
Reading package lists...
E: Unable to locate package ping
Building dependency tree...
Reading state information
先进入容器
docker run -t -i ubuntu
apt-get update
apt-get upgrade
apt install iputils-ping # ping
Docker 参数 -i -t 的作用*
通常的解释是: -t让docker分配一个伪终端并绑定到容器的标准输入上, -i则让容器的标准输入保持打开.
问题
所以通常都是这样的: sudo docker run -it ubuntu 进入了命令交互界面
但是如果不加呢? sudo docker run ubuntu 或sudo docker create ubuntu & sudo docker start ubuntu
这样的话, docker容器无法启动。
原因
Docker中系统镜像的缺省命令是 bash,如果不加 -ti bash 命令执行了自动会退出。这是因为如果没有衔接输入流,本身就会马上结束。加-ti 后docker命令会为容器分配一个伪终端,并接管其stdin/stdout支持交互操作,这时候bash命令不会自动退出。
保存对容器的修改
查看容器id
docker ps -l
提交指定容器保存为新的镜像
docker commit <container id> <new image name>
查看本地所有镜像
docker images
注意:
docker commit前需要停止容器
我安装完ping之后试了下ping www.baidu.com 然后 commit,结果就是查看镜像信息时里面COMMAND有“ping www.baidu.com”,造成每次以这个镜像启动一个容器就会去ping 百度了
运行新的镜像
> docker run ubuntu/learn ping www.google.com
检查运行中的镜像
docker inspect efe
efe为镜像的id前面部分
发布自己的镜像
首先需要登录docker的站点,然后docker login,成功后使用docker tag修改测试运行过的image,然后再docker push 【账号】/【docker】:【tag】,如果没给tag,默认就是latest,如果制定了,以后pull镜像就需要指定tag
先在https://hub.docker.com/注册个账号,然后再linux端docker login,打tag,再然后docker push上去
登陆之后仍然报错
learn/ping前面的learn是你在Docker Hub的注册名,所以把learn改成你的注册名再push
先login
docker login
再打tag
docker tag ubuntu/learn xxx/learn
xxx是你的dockerHub的id
再push
docker push xxx/learn
删除镜像和容器
删除镜像
docker rmi id
当一个镜像被多次打tag后需要先把tag的镜像删了
docker rmi xxx
xxx是镜像名称
删除镜像前必须先删除使用着的容器
删除容器
docker rm id
删除容器前必须先停止容器
停止容器
docker stop id
删除所有的容器和镜像
删除之前需要停止所有的容器
docker stop $(docker ps -a -q)
删除所有容器
docker rm $(docker ps -a -q)
删除所有镜像
docker rmi $(docker images -q)