Docker命令
查看Docker版本信息
终端输入:
docker version
Docker安装好后是不会自带镜像的,你需要从仓库自己pull一个镜像下来,自己制作自己的镜像也是一个道理,你可以通过在已有的镜像基础上生成自己的镜像或者看一下这篇博客: 随便百度的如何创建自己Docker镜像得到的教程
Docker镜像官方好像只提供Linux,这个很容易想,windows和mac是要交钱的吧大概?
搜索ubuntu的Docker镜像docker search ubuntu
,这个如果你想要什么centos,直接改就行,不区分写法,我的返回结果:
~$ docker search ubuntu
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntu is a Debian-based Linux operating s... 6636 [OK]
dorowu/ubuntu-desktop-lxde-vnc Ubuntu with openssh-server and NoVNC 131 [OK]
rastasheep/ubuntu-sshd Dockerized SSH service, built on top of of... 105 [OK]
ansible/ubuntu14.04-ansible Ubuntu 14.04 LTS with ansible 86 [OK]
ubuntu-upstart Upstart is an event-based replacement for ... 80 [OK]
neurodebian NeuroDebian provides neuroscience research... 40 [OK]
ubuntu-debootstrap debootstrap --variant=minbase --components... 31 [OK]
...
//omitted by sgy(Copyright © http://blog.csdn.net/s_gy_zetrov. All Rights Reserved)
...
拉取官方最新版的ubuntu镜像:docker pull ubuntu:latest
,其中的latest是一个标签(tag),表示是当前最新版本。你应该得到的信息,类似这样的
~$ docker pull ubuntu:latest
Trying to pull repository docker.io/library/ubuntu ...
latest: Pulling from docker.io/library/ubuntu
aed158d74952: Pull complete
773ae8273d14: Pull complete
d1d487w88782: Pull complete
cd3d6cd6c0cf: Pull complete
8d73bu79120c: Pull complete
Digest: sha256:35bc48a1ca97c3f74rhf378hj92hd82j29i4hf4hf84nf0dhnsid232de8d8
Status: Downloaded newer image for docker.io/ubuntu:latest
你输入的命令实际上相当于docker pull registry.hub.docker.com/ubuntu:latest
命令,即从注册服务器registry.hub.docker.com
中的名为ubuntu
的仓库中下载标签为latest
的镜像。
由于我的lab统一要求,ubuntu需要14.04版本,所以我在hub里面搜了搜,找到了一个用户分享的14.04 64位纯净镜像(base image),下面将他的镜像扒下来
~$ docker pull chug/ubuntu14.04x64
这个用户还有很多其他版本的ubuntu系统,12 13 14的32位64位都有,全是纯净镜像。
把初始镜像拉下来后,就可以启动它了,不过,可以先使用docker images
命令查看你自己的本地镜像
~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/ubuntu 16.04 e4415b714b62 11 days ago 128.1 MB
docker.io/ubuntu latest e4415b714b62 11 days ago 128.1 MB
docker.io/ubuntu 12.04 aefa163f7a7e 11 days ago 103.5 MB
docker.io/centos latest 0584b3d2cf6d 3 weeks ago 196.5 MB
在列出信息中,可以看到几个字段信息:
* 来自于哪个仓库,比如 ubuntu
* 镜像的标记,比如 16.04
* 它的 ID 号(唯一),比如e4415b714b62
* 创建时间
* 镜像大小
其中镜像的 ID 唯一标识了镜像,注意到 ubuntu:16.04 和 ubuntu:latest具有相同的镜像 ID ,说明它们实际上是同一镜像。 TAG 信息用来标记来自同一个仓库的不同镜像。例如 ubuntu 仓库中有多个镜像,通过 TAG 信息来区分发行版本,例如10.04 、 12.04 、 12.10 、 13.04 、 14.04 等。例如可以使用docker run -t -i ubuntu:16.04 /bin/bash命令指定使用镜像ubuntu:16.04来启动一个容器。如果不指定具体的标记,则默认使用latest标记信息。
现在你已经有一个初始的镜像了,注意这个里面是什么都没有的,连vim都没装,是精简到不能再精简的镜像了。
首先启动它:
~$ docker run -it chug/ubuntu14.04x64 /bin/bash
root@aa97ba3292ce:/#
-it 表示运行在交互模式,是-i -t的缩写,即-it是两个参数:-i和-t。前者表示打开并保持stdout,后者表示分配一个终端(pseudo-tty)一般这个模式就是可以启动bash,然后和容器有命令行的交互
可以看到我们终端的字头变成root@aa97ba3292ce:/#
了,这就意味着我们的镜像已经创建了一个容器实例。现在我们可以对这个“ubuntu系统”进行操作了
比如安装vim:
root@aa97ba3292ce:/# apt-get install vim
Reading package lists... Done
Building dependency tree... Done
The following extra packages will be installed:
file libexpat1 libffi6 libgpm2 libmagic1 libpython2.7 libpython2.7-minimal libpython2.7-stdlib libsqlite3-0 libssl1.0.0 mime-support vim-common vim-runtime
Suggested packages:
gpm ctags vim-doc vim-scripts
The following NEW packages will be installed:
file libexpat1 libffi6 libgpm2 libmagic1 libpython2.7 libpython2.7-minimal libpython2.7-stdlib libsqlite3-0 libssl1.0.0 mime-support vim vim-common vim-runtime
0 upgraded, 14 newly installed, 0 to remove and 0 not upgraded.
Need to get 10.7 MB of archives.
After this operation, 50.7 MB of additional disk space will be used.
Do you want to continue? [Y/n]
没有用sudo,是因为本来就已经是超级用户(root)状态了。
如果使用exit,命令退出,则容器的状态处于Exit,而不是后台运行。如果想让容器一直运行,而不是停止,可以使用快捷键 ctrl+p ctrl+q 退出,此时容器的状态为Up。
查看当前正在运行的容器:
~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aa97ba3292ce chug/ubuntu14.04x64 "/bin/bash" 7 minutes ago Up 7 minutes relaxed_hoover
看到当前有一个ID为aa97ba3292ce的容器
启动、停止、重启容器aa97ba3292ce的命令
~$ docker start aa97ba3292ce
~$ docker stop aa97ba3292ce
~$ docker restart aa97ba3292ce
后台启动一个容器后,如果想进入到这个容器,可以使用attach命令:
~$ docker attach aa97ba3292ce
将容器转化为一个镜像,即执行commit操作,完成后可使用docker images
查看
root@aa97ba3292ce:/#exit //先退出容器
~$ docker commit -m "ubuntu with vim" -a "sgy" aa97ba3292ce sgy/ubuntu:vim
~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
sgy/ubuntu vim 52166e4475ed 5 seconds ago 358.1 MB
chug/ubuntu14.04x64 latest 0584b3d2cf6d 9 days ago 196.5 MB
其中,-m指定说明信息;-a指定用户信息;aa97ba3292ce代表容器的id;sgy/ubuntu:vim指定目标镜像的用户名、仓库名和 tag 信息。我这里都是为了博客瞎编的用户名,我自己的用户名也不是sgy,你运行命令的时候使用自己注册Docker时的用户名。
此时Docker中就有了我们新建的镜像sgy/ubuntu:vim,此镜像和原有的ubuntu镜像区别在于多了个vim工具。此时我们利用新镜像创建的容器,本身就自带vim了。
启动新创建的镜像,可以看到vim已经自带了。
~$ docker run -it sgy/ubuntu:vim /bin/bash
root@520afc596c51:/# vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Apr 4 2017 18:14:54)
...
//omitted by sgy(Copyright © http://blog.csdn.net/s_gy_zetrov. All Rights Reserved)
...
利用exit退出容器。此时Docker引擎中就有了两个容器,可使用docker ps -a查看。
-
删除容器或者镜像
- 如果想删除容器或者镜像,可以使用rm命令,注意:删除镜像前必须先删除以此镜像为基础的容器(哪怕是已经停止的容器),否则无法删除该镜像,会报错
Failed to remove image (e4415b714b62): Error response from daemon: conflict: unable to delete e4415b714b62 (cannot be forced) - image has dependent child images
类似这种。
~$ docker rm container_id
~$ docker rmi image_id
有的时候尽管删除了全部容器,镜像还是无法删除,这时点击mac顶栏中的docker logo,选择restart,然后再试一次rmi,应该就没问题了。
docker容器数据卷是什么?
当我们在使用docker容器的时候,会产生一系列的数据文件,这些数据文件在我们关闭docker容器时是会消失的,但是其中产生的部分内容我们是希望能够把它给保存起来另作用途的,Docker将应用与运行环境打包成容器发布,我们希望在运行过程钟产生的部分数据是可以持久化的的,而且容器之间我们希望能够实现数据共享。
通俗地来说,docker容器数据卷可以看成使我们生活中常用的u盘,它存在于一个或多个的容器中,由docker挂载到容器,但不属于联合文件系统,Docker不会在容器删除时删除其挂载的数据卷。
特点:
1:数据卷可以在容器之间共享或重用数据
2:数据卷中的更改可以直接生效
3:数据卷中的更改不会包含在镜像的更新中
4:数据卷的生命周期一直持续到没有容器使用它为止
添加数据卷的方式有两种,第一种是直接通过命令行挂载,第二种是通过dockerFile添加
首先来说第一种通过命令行挂载的方式,命令如下:
docker run -it -v /宿主机绝对路径目录: /容器内目录 镜像名
这个命令会在宿主机和容器内分别建立两个目录,两个目录是对接的,里面的数据可以共享。如果我们不知道数据卷是否挂载成功时,我们可以通过以下方式来检查数据卷的挂载结果。
docker inspect 容器id
上面的命令可以查看容器的详细情况,命令返回的是JSON格式的字符串,运行命令之后我们在返回的JSON字符串中找到Volumes属性,假如挂载成功的话,Volumes里面显示的绑定结果应该是你在挂载时输入的命令参数 (/宿主机绝对路径目录: /容器内目录 ),如果与你们之前输入的一致的话,证明挂载成功。PS: Volumes里面显示的绑定结果可能有多个,但是只要找到目标结果就可以。挂载之后,当容器停止运行的时候,宿主机上对数据卷做的内容修改是会同步到容器内的。
我们再挂载的时候还可以给数据卷加上权限,假如我们要宿主机只能读取容器的数据卷内容不能修改,我们可以添加只读权限
docker run -it -v /宿主机绝对路径目录 : /容器内目录 :ro 镜像名
至于只写的话我们一般不会用到,要么就是读写,要么就是只读,而且我们可以通过docker inspect 来查看容器的volumesRW来查看容器内数据卷的读写权限。
第二种就是利用dockerFile的形式添加
dockerFile对于docker镜像而言就如同java中某个类的.class文件对应上该类的.java文件。
首先在linux服务器根目录上新建docker文件夹并建立DockerFile文件,使用volume命令(出于可移植可分享的的考虑,用以上 -v /宿主机绝对路径目录 : /容器内目录 的这种方式不能够直接在dockerFile中直接实现,因为宿主机目录是依赖于特定的宿主机的,并不能保证所有的宿主机都存在这样特定的目录)
编写的dockerFile文件如下
FROM 镜像名
VOLUME ["/生成的目录路径"] -- privileged=true
CMD echo "success build"
CMD /bin/bash
相当于命令行: docker run -it -v /宿主机目录路径 : /生成的目录路径
然后我们通过命令行docker build执行我们写好的dockerFile文件(docker build和docker commit两个命令都可以建立docker镜像,docker commit 需要在容器内进行,docker build 不需要)
docker build -f /docker/DockerFile -t 命名空间/镜像名
执行后输入docker images就可以发现自己通过DockerFile所build的镜像,里面有挂载数据卷,那么问题来了宿主机所对应的目录是什么呢?同上,我们可以通过docker inspect来查看当前容器的Volumes,里面会有宿主机的数据卷目录。
什么是docker数据卷容器?
上面介绍了docker容器数据卷,它的作用相当于生活中的活动硬盘,那么数据卷容器就相当于把多个活动硬盘再挂载到一个活动硬盘上,实现数据的传递依赖。
官网解析:命名的容器挂载数据卷,其他的容器通过挂载这个父容器实现数据共享,挂载数据卷的容器,我们称为数据卷容器。
首先,我们建立父容器
docker run -it - -name parentContainer 镜像名(可以填上面通过dockerFile建立的镜像,里面有挂载容器卷)
然后建立两个子容器继承父容器
docker run -it - -name sonContainer1 --volumes -from parentContainer 镜像名
docker run -it - -name sonContainer2 --volumes -from parentContainer 镜像名
假设我们DockerFile里面定义的容器卷目录为dockerVolume,父容器里面有dockerVolume目录,子容器继承了父容器的dockerVolume,在字容器中的dockerVolume目录作出的修改会同步到父容器的dockerVolume目录上,达到了继承和数据共享的目的。
官网上有一句话描述的是,容器之间配置信息的传递,数据卷的生命周期会一致持续到没有容器使用它为止,换言之,只要有一个容器仍在使用该数据卷,该数据卷一直都可以进行数据共享,通俗地来说,如果此时我们把父容器关闭掉,两个字容器之间依旧可以进行数据共享,而且通过继承子容器生成的新容器,一样可以与子容器进行数据共享。这就是docker容器间的数据传递共享。
docker-compose
docker-compose命令必须运行在,docker-compose.yml文件所在的目录才有效;如果docker-compose up -d未成功,修改了配置文件,最好先docker-compose stop,然后 docker-compose rm 再重新做镜像docker-compose build
docker-compose命令有:up/stop/rm/logs/ps
docker-compose.yml常用命令有:build/command/depends_on/ports/volumes/image
compose文件是一个定义服务,网络和卷的ymal文件。
volume配置的作用是把容器内的数据,存在本地,因为容器rm之后,容器内的数据也会一并消失。
编写docker-compose.yml
Docker Compose的模板文件主要分为3个区域,为:
services
服务,在它下面可以定义应用需要的一些服务,每个服务都有自己的名字、使用的镜像、挂载的数据卷、所属的网络、依赖哪些其他服务等等。
volumes
数据卷,在它下面可以定义的数据卷(名字等等),然后挂载到不同的服务下去使用。
networks
应用的网络,在它下面可以定义应用的名字、使用的网络类型等等。
例:
version: '3'
services:
back:
image: backService:1.0
container_name: back
environment:
- name=tom
- DB_PATH=jdbc:sqlite:/data/ns.db
restart: always
privileged: true
ports:
- "9000:9000"
networks:
- "net"
volumes:
- "/root/k3s.kube.config:/k3s.kube.config"
- "/root/data:/data"
- "/etc/network/interfaces:/etc/network/interfaces"
front:
image: front:1.0
container_name: front
restart: always
ports:
- "10087:80"
networks:
- "net"
volumes:
- "/root/nginx.conf:/etc/nginx/nginx.conf"
networks:
net:
driver: bridge
Docker Compose常用模板文件主要命令:
build 指定服务镜像Dockerfile所在路径
cap_add,cap_drop 指定容器的内核能力(capacity)分配
command 覆盖容器启动后默认执行的命令
cgroup_parent 指定父cgroup组,意味着将基础该组的资源限制
container_name 指定容器名称。默认将会使用项目名称_服务名称_序号这样的格式
devices 指定设置映射关系
dns 自定义DNS服务器。可以是一个值,也可以是一个列表
dns_search 配置DNS搜索域。可以是一个值,也可以是一个列表
dockerfile 指定额外编译镜像的Dockerfile文件,可以通过该指令来指定
env_file 从文件中获取环境变量,可以为单独的文件路径或列表
environment 设置环境变量,可以使用数组或字典两种格式
expose 暴露端口
extends 基于其他模板文件进行扩展
external_links 链接到docker-compose.yml外部的容器,甚至可以是非Compose管理的外部容器
extra_hosts 指定额外的host名称映射信息
image 指定为镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取这个镜像
labels 指定服务镜像Dockerfile所在路径
links 链接到其他服务中的容器
log_driver 指定日志驱动类型,类似于Docker中的–log-driver参数。目前支持三种日志驱动类型:log_driver:“json-file”、log_driver:“syslog”、log_driver:“none”
log_opt 日志驱动的相关参数
net 设置网络模式。参数类似于docker clinet的–net参数一样
pid 跟主机系统共享进程命名空间。打开该选项的容器之间,以及容器和宿主机系统之间可以通过进程ID来相互访问和操作
ports 暴露端口信息
security_opt 指定容器模板标签(label)机制的默认属性(如用户、角色、类型、级别等)
ulimits 指定容器的ulimits限制值
volumes 数据卷所挂载路径设置。可以设置宿主机路径(HOST:CONTAINER)或加上访问模式(HOST:CONTAINER:ro)
volumes_driver 较新版本的Docker支持数据卷的插件驱动
volumes_from 从另一个服务或容器挂载它的数据卷