docker是什么
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。 Docker 利用 Linux 核心中的资源分离机制,例如 cgroups,以及 Linux 核心名字空间,来创建独立的容器。期望达到使项目运行环境“一次封装,到处运行的目的”。
这可以在单一 Linux 实体下运作,避免引导一个虚拟机造成的额外负担。Linux 核心对名字空间的支持完全隔离了工作环境中应用程序的视野,包括行程树、网络、用户 ID 与挂载文件系统,而核心的 cgroup 提供资源隔离,包括 CPU、存储器、block I/O 与网络。
从 0.9 版本起,Dockers 在使用抽象虚拟是经由 libvirt 的 LXC 与 systemd – nspawn 提供界面的基础上,开始包括 libcontainer 库做为以自己的方式开始直接使用由 Linux 核心提供的虚拟化的设施,
依据行业分析公司“451 研究”:“Dockers 是有能力打包应用程序及其虚拟容器,可以在任何 Linux 服务器上运行的依赖性工具,这有助于实现灵活性和便携性,应用程序在任何地方都可以运行,无论是公有云、私有云、单机等。” 。
Dockerfile 是软件的原材料,Docker 镜像是软件的交付品,而 Docker 容器则可以认为是软件的运行态。从应用软件的角度来看,Dockerfile、Docker 镜像与 Docker 容器分别代表软件的三个不同阶段,Dockerfile 面向开发,Docker 镜像成为交付标准,Docker 容器则涉及部署与运维,三者缺一不可,合力充当 Docker 体系的基石。
docker 配置阿里云镜像
默认的docker镜像仓库在dockerhub,网站美国,所以下载速度非常慢,为了解决这个问题,
国内的一些机构提供了镜像加速服务,最出名的就是阿里云,下面介绍如何配置阿里云镜像
加速;
第一步:
http://dev.aliyun.com 打开阿里云,注册账号或者用淘宝账号登陆;
第二步:
点击进入控制台
第三步:
选择容器镜像服务,选择镜像加速
第四步:
修改daemon配置文件/etc/docker/daemon.json来使用加速器
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://f1z25q5p.mirror.aliyuncs.com"]
}
保存,运行下面命令,重启docker服务
sudo systemctl daemon-reload
sudo systemctl restart docker
到此结束,docker配置阿里云镜像加速完成,下次拉取镜像就会从阿里云的服务器上下载,
速度会很快速
window10安装docker
使用win10 安装docker的话,建议通过Docker Toolbox安装。 安装前的准备,查看电脑是否已开启虚拟化,查看方式:可以打开任务管理器->性能->cpu 查看是否有 虚拟化:已启用字样。
下载Docker Toolbox 下载地址http://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/。
下载完毕后桌面会默认生成三个exe文件图标 打开Docker Quickstart Terminal进入客户端。
双击Docker Quickstart Terminal图标,启动一个终端,第一次启动的话你会看到命令行会下载一些东西,等待一下(如果长时间没有下载成功也可以用迅雷下载到指定路径),它会配置Docker Toolbox,之后,当它完成后,你会看到启动成功的画面。
这个终端是运行在bash环境下的,而不是标准的windows命令行,因为Docker需要运行在bash环境下,否则一些命令无法运行。在命令行中输入docker run hello-world并按回车键,如果docker配置成功的话,你会看到命令行中有如下输出:
接下来我们将通过一个例子(whalesay)来介绍如何运行Docker镜像。
在运行镜像之前,先让我们来知道一个获取别人已经做好的镜像的方法。因为全世界的人都能够创建Docker镜像,因此Docker提供了一个叫做Docker Hub的地方可以让人们分享自己的Docker镜像或获取别人的Docker镜像。
打开你的浏览器,并且打开 Docker Hub 地址,在搜索输入框中输入whalesay。在结果中找到docker/whalesay。
找到docker/whalesay
点击docker/whalesay,将会看到whalesay镜像的仓库以及它的一些介绍。
whalesay镜像的仓库以及它的一些介绍
每一个镜像仓库都包含一些关于镜像的信息,这些信息必须包括如镜像中包含了什么软件以及如何使用它们。你可能注意到whalesay镜像是基于Linux的一个发行版Ubuntu,接下来,我们将看到如何在你的机器中运行whalesay镜像。
在终端中输入docker run docker/whalesay cowsay boo并且回车
运行情况
当你第一次运行软件镜像的时候,docker命令会先查找你本地系统中是否有这个镜像,如果镜像不存在的话,那么docker会自动从hub上获取这个镜像。
接下来,在终端中输入 docker images 并且回车,这个命令将显示出你的本地系统中有哪些景象,这个时候你将看到刚刚已经安装了docker/whalesay镜像在列表里面了。
镜像列表
当你在容器中运行镜像的时候,Docker会下载镜像到你的电脑里面。当镜像的源在hub上被改变的时候,Docker会下载并更新本地的镜像。当然,本地镜像也是可以删除掉的。
可以试一下运行下面这个命令:docker run docker/whalesay cowsay Hello-Harry:
Hello-Harry
OK!你已经安装好docker,并且会简单的使用了。
docker的使用(ubuntu为例)
利用docker创建的运行环境叫做docker容器,容器是通过docker镜像创建的,docker镜像文件可以放在私有仓库中也可以放在共有仓库中。最大的公有仓库是官方Docker Hub。
查看当前版本
docker version
查看本地所有镜像文件
docker images
搜索互联网上镜像
docker search redis # 搜索redis镜像
获取云中ubuntu14的镜像
docker pull ubuntu:14.04
此时查看docker镜像显示
创建一个ubuntu14的容器,并且运行容器
docker run -i -t ubuntu:14.04 /bin/bash
docker run -it --name test3 -v /mnt/data:/data ubuntu14.04-backup /bin/bash #共享文件版
-i 表示标准模式;-t 表示是否分配一个伪终端,默认false; -rm 表示容器退出后是否自动删除,默认为false;执行后就进入了docker容器,输入”exit“推出镜像系统。docker run的其他指令。
注意:
* docker run 只在第一次运行时使用,将镜像放到容器中,以后再次启动这个容器时,只需要使用命令docker start 即可。
* docker run相当于执行了两步操作:将镜像放入容器中(docker create),然后将容器启动,使之变成运行时容器(docker start)。
* 退出时如果不想终止当前执行的容器,应先按,ctrl+p 再按,ctrl+q 绝对不能使用exit或者ctrl+d来退出,这样整个系统就退出了!!!
此时提示符会出现 container 的id ;
列出全部装载的容器,包括已停止的和正在运行的
docker ps -a #列出全部装载的容器,包括已停止的和正在运行的
docker ps #列出当前正在运行的容器
可以看到对应container的ID,Image,status, 以及 names
退出后 再进入ubuntu(容器)
sudo docker start a40cc085c83d #启动容器
sudo docker attach a40cc085c83d #进入运行中的容器(此时没反应,ctrl+c就进入到ubuntu系统中去了)
注意: 此时 ubuntu 环境下做一些事情, 比如:apt-get install 一些包 , exit 之后
重启的命令为 docker start -it container_name
* 一定要加 -it 否则 不会有 ubuntu 交互命令行
其他指令
docker tag xxx tagname 镜像文件加标签;
docker search xxx 查找官方镜像;
docker rmi xxxID/xxxname 删除镜像文件;
docker rm xxx 删除容器;
docker push xxx;上传镜像;
docker import xxx 导入镜像;
docker stop xxx 终止容器;
docker pause xxx 暂停容器;
docker unpause xxx 恢复容器;
docker kill xxx 强制杀死容器;
docker attach xxxID/xxxname 进入后台运行的容器;
docker container inspect xxx 查看一个容器;
docker top xxx 查看容器内进程;
docker stat xxx 查看容器内cup使用情况;
docker container port test 查看容器端口;
docker commit origin_container_id new_image 执行一些新的操作后添加容器到另外一个镜像/保存版本号
docker exec -it CONTAINER_ID bash 进入容器终端并且的保留为容器终端的输入形式.
win10 DockerToolbox 将window目录共享给docker容器
然后配置virtualbox虚拟机与docker容器之间的文件夹共享:
#将前面在虚拟机中创建的 /mnt/data 目录挂载到docker容器的 /data 中:
docker run -it --name test3 -v /mnt/data:/data ubuntu14.04-backup /bin/bash
对docker 数据卷的管理
数据卷指容器与主机的共享/映射目录
默认是 /var/lib/docker/volumes,也可指定路径
创建一个容器ubuntu命名为dbdata,放在数据卷dbdata里面
docker run -it -v /dbdata --name dbdata ubuntu
更实用的:
sudo docker run -it --name kalibr -v /home/dell/docker/:/home/catkin_ws jorgeluisrmx/ros-indigo /bin/bash
注:共享宿主机 home下docker 文件 一定写成绝度路径的形式,即 /home/dell/docker.
通过镜像training/webapp创建一个后台运行的容器命名为web,并在其中运行python app.py。自动分配端口号,把容器中webapp映射到主机/opt/webapp 位置。
docker run -d -P --name web --mount type=bind,source=/webapp,destination=/opt/webapp training/webapp python app.py
docker容器内文件编辑
1.通过Vi编辑,安装个Vi软件就行。
2.容器内文件与本机文件间相互拷贝。
通过docker cp把这个文件拷贝出来
sudo docker cp xxxx:/etc/mysql/my.cnf /home/tom/
再拷贝回去
sudo docker cp /home/tom/my.cnf xxxx:/etc/mysql/
注意:
这个xxxx是docker ps -a 获取的container id
docker镜像的导出与导入
docker镜像导出
先用docker images 查看本地的docker镜像,然后执行:
docker save 2c5e00d77a67 > D:\Docker\ubuntu14.04.tar
注意:
save是导出命令,4e4c445311e6是镜像ID,然后空格,一定要空格否则会报错!空格之后输入“>”,再空格,输入你想要导出的路径和导出后的文件名。如上,导出到C盘,文件名为node.tar。
稍等片刻,你就能看到C盘里有node.tar 的压缩文件。
注意:如果docker用户权限不够,需先切至root用户:
docker-machine ssh #进入虚拟机系统
sudo -i #切换至超级用户
如果你想把tar 包导入进docker 虚拟机,用docker load 命令。
操作结果如下图:
docker镜像导入
#格式为
docker load < 路径\文件名
注意:
格式,load和“<”之间要有空格,“<”和“D:\***.tar”之间要有空格。
docker容器的备份、恢复和迁移
所有的Docker镜像层对于容器来说,都是只读的,容器对于文件的写操作绝对不会作用在镜像中。因此如果我们想保存我们已经做了一些操作的容器,我们需要对容器进行备份。
1.备份容器
首先,为了备份Docker中的容器,我们会想看看我们想要备份的容器列表。要达成该目的,我们需要在我们运行着Docker引擎,并已创建了容器的Linux机器中运行 docker ps 命令。
在此之后,我们要选择我们想要备份的容器,然后去创建该容器的快照。我们可以使用 docker commit 命令来创建快照。
docker commit :从容器创建一个新的镜像。
# docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停。
docker commit -a "wangdongsheng" -m "add opencv" 16b306ace74e mykalibr:v0.1
该命令会生成一个作为Docker镜像的容器快照,我们可以通过运行 docker images 命令来查看Docker新备份的镜像。
上面做的快照已经作为Docker镜像保存了。现在,为了备份该快照,我们有两个选择,一个是我们可以登录进Docker注册中心,并推送该镜像;另一个是我们可以将Docker镜像打包成tar包备份,以供今后使用。
如果我们想要在Docker注册中心上传或备份镜像,我们只需要运行 docker login 命令来登录进Docker注册中心,然后推送所需的镜像即可。
docker login
docker tag a25ddfec4d2a arunpyasi/container-backup:test
docker push arunpyasi/container-backup
如果我们不想备份到docker注册中心,而是想要将此镜像保存在本地机器中,以供日后使用,那么我们可以将其作为tar包备份。要完成该操作,我们需要运行以下 docker save 命令。参考上一章节docker镜像的导出与导入内容。
2. 恢复容器
接下来,在我们成功备份了我们的Docker容器后,我们现在来恢复这些制作了Docker镜像快照的容器。如果我们已经在注册中心推送了这些Docker镜像,那么我们仅仅需要把那个Docker镜像拖回并直接运行即可。
docker pull arunpyasi/container-backup:test
但是,如果我们将这些Docker镜像作为tar包文件备份到了本地,那么我们只要使用 docker load 命令,后面加上tar包的备份路径,就可以加载该Docker镜像了。参考上一章节docker镜像的导出与导入内容。
在镜像被加载后,我们将用加载的镜像去运行Docker容器。
3. 迁移Docker容器
迁移容器同时涉及到了上面两个操作,备份和恢复。我们可以将任何一个Docker容器从一台机器迁移到另一台机器。在迁移过程中,首先我们将把容器备份为Docker镜像快照。然后,该Docker镜像或者是被推送到了Docker注册中心,或者被作为tar包文件保存到了本地。如果我们将镜像推送到了Docker注册中心,我们简单地从任何我们想要的机器上使用 docker run 命令来恢复并运行该容器。但是,如果我们将镜像打包成tar包备份到了本地,我们只需要拷贝或移动该镜像到我们想要的机器上,加载该镜像并运行需要的容器即可。
docker使用案例
我们创建一个ubuntu14.04的Docker镜像,将其运行起来后,并通过浏览器进行访问.
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 14.04 2c5e00d77a67 7 months ago 188MB
hello-world latest fce289e99eb9 11 months ago 1.84kB
docker/whalesay latest 6b362a9f73eb 4 years ago 247MB
dell@DESKTOP-3A7NUAG MINGW64 /c/Program Files/Docker Toolbox
$ docker run -i -t ubuntu:14.04 /bin/bash
root@2b5c8535d957:/# cd home/
root@2b5c8535d957:/home# mkdir test
root@2b5c8535d957:/home# ls
test
root@2b5c8535d957:/home# exit
exit
dell@DESKTOP-3A7NUAG MINGW64 /c/Program Files/Docker Toolbox
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2b5c8535d957 ubuntu:14.04 "/bin/bash" About a minute ago Exited (0) 18 seconds ago jovial_lederberg
4f2f9b72054e ubuntu:14.04 "/bin/bash" 45 minutes ago Up 45 minutes busy_hugle
dc58014d3127 docker/whalesay "cowsay boo" 3 hours ago Exited (0) 3 hours ago charming_leakey
518c2b5b233f hello-world "/hello" 3 hours ago Exited (0) 3 hours ago sharp_lumiere
e466c342ca70 hello-world "/hello" 3 hours ago Exited (0) 3 hours ago confident_jang
ff9c375780ac hello-world "/hello" 3 hours ago Exited (0) 3 hours ago angry_lalande
dell@DESKTOP-3A7NUAG MINGW64 /c/Program Files/Docker Toolbox
$ docker commit 2b5c8535d957 ubuntu14.04-backup
sha256:606d75ed19c674d9acc0665a2ef8e5a672642941c546387ff6ec07fd61f26685
dell@DESKTOP-3A7NUAG MINGW64 /c/Program Files/Docker Toolbox
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu14.04-backup latest 606d75ed19c6 10 seconds ago 188MB
ubuntu 14.04 2c5e00d77a67 7 months ago 188MB
hello-world latest fce289e99eb9 11 months ago 1.84kB
docker/whalesay latest 6b362a9f73eb 4 years ago 247MB
dell@DESKTOP-3A7NUAG MINGW64 /c/Program Files/Docker Toolbox
$ docker run -i -t -d --name ubuntu-test -p 9000:80 ubuntu14.04-backup /bin/bash C:\Program Files\Docker Toolbox\docker.exe: Error response from daemon: Conflict. The container name "/ubuntu-test" is already in use by container "1535a7c5f6f3f175b5007318662f19f996ad57808eaf86b5bd99c5f5bdd0c588". You have to remove (or rename) that container to be able to reuse that name.
See 'C:\Program Files\Docker Toolbox\docker.exe run --help'.
dell@DESKTOP-3A7NUAG MINGW64 /c/Program Files/Docker Toolbox
$ docker run -i -t -d --name ubuntu-test2 -p 9000:80 ubuntu14.04-backup /bin/bash
2702f9fcb476db1e4918eec3c11b8f533bd8e132c28a56bd12d080087f91ceef
dell@DESKTOP-3A7NUAG MINGW64 /c/Program Files/Docker Toolbox
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2702f9fcb476 ubuntu14.04-backup "/bin/bash" 11 seconds ago Up 11 seconds 0.0.0.0:9000->80/tcp ubuntu-test2
4f2f9b72054e ubuntu:14.04 "/bin/bash" About an hour ago Up 57 minutes busy_hugle
dell@DESKTOP-3A7NUAG MINGW64 /c/Program Files/Docker Toolbox
$ ipconfig
Windows IP 配置
以太网适配器 以太网:
媒体状态 . . . . . . . . . . . . : 媒体已断开连接
连接特定的 DNS 后缀 . . . . . . . :
以太网适配器 VirtualBox Host-Only Network:
连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::8ccd:19ba:9bb6:8a24%45
IPv4 地址 . . . . . . . . . . . . : 192.168.56.1
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . :
以太网适配器 VirtualBox Host-Only Network #2:
连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::5512:d2ee:e5d9:3d27%54
IPv4 地址 . . . . . . . . . . . . : 192.168.99.1
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . :
无线局域网适配器 本地连接* 1:
媒体状态 . . . . . . . . . . . . : 媒体已断开连接
连接特定的 DNS 后缀 . . . . . . . :
无线局域网适配器 本地连接* 10:
媒体状态 . . . . . . . . . . . . : 媒体已断开连接
连接特定的 DNS 后缀 . . . . . . . :
无线局域网适配器 WLAN:
连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::8dfd:87bb:e9b:9153%11
IPv4 地址 . . . . . . . . . . . . : 192.168.107.19
子网掩码 . . . . . . . . . . . . : 255.255.248.0
默认网关. . . . . . . . . . . . . : 192.168.104.1
以太网适配器 以太网 2:
媒体状态 . . . . . . . . . . . . : 媒体已断开连接
连接特定的 DNS 后缀 . . . . . . . :
以太网适配器 蓝牙网络连接:
媒体状态 . . . . . . . . . . . . : 媒体已断开连接
连接特定的 DNS 后缀 . . . . . . . :
dell@DESKTOP-3A7NUAG MINGW64 /c/Program Files/Docker Toolbox
$
Linux下docker安装
1.更新Ubuntu的apt源索引
$ sudo apt-get update
2.安装包允许apt通过HTTPS使用仓库
$ sudo dpkg --configure -a
$ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
3.添加Docker官方GPG key
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
4.设置Docker稳定版仓库
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
5.更新apt源索引
$ sudo apt-get update
6.安装最新版本Docker CE(社区版)
$ sudo apt-get install docker-ce
查看安装Docker的版本
$ docker --version
检查Docker CE 是否安装正确
$ sudo docker run hello-world
基本命令
# 启动docker
sudo service docker start
# 停止docker
sudo service docker stop
# 重启docker
sudo service docker restart
# 列出镜像
docker image ls
# 拉取镜像
docker image pull library/hello-world
# 删除镜像
docker image rm 镜像id/镜像ID
# 创建容器
docker run [选项参数] 镜像名 [命令]
# 停止一个已经在运行的容器
docker container stop 容器名或容器id
# 启动一个已经停止的容器
docker container start 容器名或容器id
# kill掉一个已经在运行的容器
docker container kill 容器名或容器id
# 删除容器
docker container rm 容器名或容器id
使用时:
利用数据卷共享工程,编译再到docker 容器里面
参考链接:
https://www.jianshu.com/p/e8427d12b3e0
https://www.leiue.com/what-is-docker
https://www.jianshu.com/p/36350a72fe44
https://blog.csdn.net/weixin_42547154/article/details/84107501
https://www.cnblogs.com/yizhipanghu/p/9681225.html