docker的安装与使用
docker中文社区
[docker中文社区,docker帮助,docker手册,docker教程,docker安装手册 - docker中文社区]()
docker是什么
docker是一个解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术
为什么使用docker
环境
1.虚拟机
centos7.7,自己安装的虚拟机非阿里云
2.查看系统版本命令
lsb_release -a
如果上面命令执行提示未找到命令就执行以下命令
yum install -y redhat-lsb
3.查看并且关闭防火墙
systemctl status firewalld
systemctl stop firewalld
安装docker
1.安装工具包
sudo yum install -y yum-utils
或者执行
yum update
耗时较长,耐心等待
2.设置远程仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
3.安装docker
sudo yum install docker-ce
4.启动docker
启动
service docker start
停止
service docker stop
重启
service docker restart
查看版本
docker version/docker –v
加入开启启动
chkconfig docker on
5.效验
docker run hello-world
6.docker基本命令
查看所有正在运行的容器
docker ps
查看所有正在运行包括启动失败的容器
docker ps -a
删除容器
docker rm 容器名称/容器ID
如果容器正在运行,需要停止容器才能删除
停止容器
docker stop 容器ID
查看所有的镜像
docker images
删除镜像
docker rmi 镜像名称/IMAGE ID
强制删除镜像
docker image rm -f 镜像名称/IMAGE ID
删除所有镜像
如下图所示我pull了三个镜像
docker images
获取所有镜像的IMAGE ID
docker images -qa
删除所有镜像
docker rmi $(docker images -qa)
再查看已经没有了
docker images
删除所有容器
可先使用docker ps -qa 查询所有容器的ID,然后使用docker stop (docker ps -qa)删除所有容器
下面演示删除所有镜像,如下图所示,遇到了如下问题
可使用以下命令解决
删除容器ID docker rm 占用的容器ID(上图的d652b36931f5) 或者强制删除 docker image rm -f 镜像名称/IMAGE ID
配置阿里云加速器
1.登录阿里云开发者平台
[阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台 (aliyun.com)](cr.console.aliyun.com/cn-hangzhou…)
2.首次登录设置密码
3.获取加速地址
https://********.mirror.aliyuncs.com
4.根据个人需要选择docker的os,安装要求修改docker配置文件,我这里使用centos,步骤如下
新建daemon.json文件
在/etc/docker/目录下新建文件daemon.json,编辑vim/etc/docker/daemon.json文件添加如下内容
{ "registry-mirrors": ["https://*******.mirror.aliyuncs.com"] }
保存退出,然后重启docker
systemctl daemon-reloadsystemctl restart docker
或者一次性执行下面命令
sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://hmchwtyi.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
查看docker启动状态
service docker status
以后通过docker pull命令获取所需要的镜像就比直接在官网下载快多了
docker安装tomcat
1.获取tomcat镜像
搜索镜像
docker search tomcat
拉取镜像
docker pull tomcat
配置了阿里云的加速器之后速度会快很多
指定版本拉取
docker pull tomcat:8.0.53
自行官网搜索需要的版本:[Docker Hub](hub.docker.com/)(超级慢)搜索自己需…
2.查看所有镜像
docker images
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
3.运行容器
docker run --name tomcat -p 8080:8080 -v $PWD/test:/usr/local/tomcat/webapps/test -d tomcat
参数解释
a) -p 8080:8080:将容器的 8080 端口映射到主机的 8080 端口
b) -v $PWD/test:/usr/local/tomcat/webapps/test:将主机中当前目录下的 test 挂载到容器的 /test
访问测试192.168.0.192:8080
4.如果有两个不同版本的tomcat,如下图所示
运行时需要指定TAG运行,最好使用别名区分,以免混淆
docker run --name mytomcat(别名) -p 8081(指定8081端口):8080 -v $PWD/test:/usr/local/tomcat/webapps/test -d tomcat:8.0.53(指定TAG)
5.部署war包
进入容器
docker exec -it NAME/ CONTAINER ID bash
将war包上传到任意目录
我这里是:/home/liucong/tomcat
执行cp命令
然后在war包所在的目录下执行:
docker cp datamgt.war tomcat:/usr/local/tomcat/webapps将war包移动到tomcat容器中的webapps下
进入容器查看是否存在datamgt.war
进入容器查看是否存在datamgt.war
上图所示war包会自动解压,退出容器exit,然后执行命令重启容器
docker restart tomcat
查看容器最近三十分钟日志
docker logs --since 30m tomcat
浏览器访问
docker安装mysql
1.官网搜索想要拉取的版本
本次安装mysql5.7.28,如果不指定版本默认安装最高版本
docker pull
docker pull mysql:5.7.28
运行容器
docker run -p 3306:3306 --name mysql -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/logs:/logs -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=rootroot -d mysql:5.7.28
-p 3306:3306: 映射容器服务的 3306 端口到宿主机的 3306 端口,外部主机可以直接通过 宿主机ip:3306 访问到 MySQL 的服务
–v:将宿主机目录挂载到容器进行数据同步
MYSQL_ROOT_PASSWORD=rootroot:设置mysql服务root用户的密码
查看是否安装成功:docker ps,如下图所示启动了tomcat和mysql两个容器
进入mysql容器之后登陆mysql
sudo docker exec -it mysql /bin/bash
输入上面设置的密码
2.使用工具连接
将本地docker镜像上传至阿里云镜像仓库
1. 登录阿里云镜像仓库
[阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台 (aliyun.com)
进入阿里云容器镜像服务控制台,首次进入需设置密码,如下图所示
目前控制没有任何私有镜像,如下图所示
创建一个镜像仓库,如下图所示
设置命名空间,仓库名称,私有或者是公开,如果是公开那么所有人都可以搜索到你上传的镜像
使用命令登录阿里云镜像仓库
docker login --username=fdliucong@gmail.com registry.cn-hangzhou.aliyuncs.com
密码就是上面设置的密码,如下图所示表示登录成功
2.查看需要上传的镜像
docker images
3.push我们需要上传的镜像
如下图所示,耐心等待(感觉超级慢,是镜像太大?网络不好?)
docker tag ef6a7c98d192 registry.cn-hangzhou.aliyuncs.com/liucong/tomcat:8.0.53
sudo docker push registry.cn-hangzhou.aliyuncs.com/liucong/tomcat:8.0.53
4.上传成功,如下图所示,阿里云镜像服务控制台就会存在
5.如果镜像设置了公开,就会被其他人搜索到,如果不想如此,请设置成私有
6.从另外一台服务器拉取我们刚刚上传的镜像,并启动tomcat服务
现在使用另一台服务器(192.168.0.191)安装docker,然后拉取镜像,步骤请参考上面步骤,这里不再重复贴图
首先登陆阿里云镜像服务
sudo docker login --username=fdliucong@gmail.com registry.cn-hangzhou.aliyuncs.com
然后执行拉取命令:
sudo docker pull registry.cn-hangzhou.aliyuncs.com/liucong/tomcat:8.0.53
版本号和阿里云镜像服务保持一致
查看镜像
docker images
运行这个镜像
docker run --name tomcat -p 8080:8080 -v $PWD/test:/usr/local/tomcat/webapps/test -d ef6a7c98d192
进入容器
docker exec -it CONTAINER ID bash
访问
docker容器数据卷
1.容器数据卷是什么
当我们在使用docker容器的时候,会产生一系列的数据文件,这些数据文件在我们关闭docker容器时是会消失的,但是其中产生的部分内容我们是希望能够把它给保存起来另作用途的,Docker将应用与运行环境打包成容器发布,我们希望在运行过程钟产生的部分数据是可以持久化的的,而且容器之间我们希望能够实现数据共享。
通俗地来说,docker容器数据卷可以看成使我们生活中常用的u盘,它存在于一个或多个的容器中,由docker挂载到容器,但不属于联合文件系统,Docker不会在容器删除时删除其挂载的数据卷
2.有什么特点
a) 数据卷可以在容器之前共享或重用数据
b) 数据卷中的更改可以直接生效
c) 数据卷中的更改不会包含在镜像的更新中
d)数据卷的生命周期一直持续到没有容器使用它为止
3.添加数据卷的两种方式
通过命令挂载(即使容器退出后也会同步)
-
首先通过
docker pull centos拉取了一个centos的镜像,下面演示通过命令挂载的方式
-
执行命令
docker run -d -it -v /home/mycentosdata:/mycentos centosdocker run -d(后台运行,否则退出容器之后,容器就会停止) -it -v /宿主机绝对路径:/容器内目录 镜像名/镜像ID
这个命令会在宿主机和容器内分别建立两个目录,这两个目录是对接的,里面的数据可以共享
-
查看是否挂载成功
在容器里面执行ls -ll命令发现可以看到已经生成了mycentos文件夹
再看下宿主机的home目录,也生成了mycentosdata目录
-
用命令查看
docker inspect 容器ID此命令执行之后会返回一个json串,由于太长这里不贴了,只贴部分截图,如下图所示,表示挂载成功
-
下面我们在宿主机新建的mycentosdata新建一个文件a.txt,容器内的mycentos也会相应的生成,如下图所示
docker exec -it 9f55d0ebb0e4(容器ID,非镜像ID) /bin/bash就算是停止容器之后也会共享,这里就不做演示了,自行尝试
通过Dockerfile的形式添加
注:使用Dockerfile方式宿主机不会生成相应目录,但也会生成一个默认的文件,如下图所示
-
为了规范我在宿主机根目录下创建docker文件夹并建立dockerfile文件,并添加以下内容
FROM centos VOLUME ["/mydockerfiledata","/mydockerfiledata1"] -- 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'(dockerfile绝对路径)-t liucong/centos(镜像别名,这里加了个命名空间以便区分) .(切记后面有个点)docker build -f '/docker/DockerFile' -t liucong/centos .如下图所示表示编译成功
docker images命令查看,如下图所示已经有两个centos镜像
-
运行liucong/centos镜像:通过命令将/home/mycentosdata目录挂载到新生成的两个目录
docker run -d -it -v /home/mycentosdata:/mydockerfiledata liucong/centos使用Dockerfile方式挂载在宿主机上生成默认的文件夹,如下图所示
使用
docker inspect 978edcf8f273(容器ID)查看挂载信息
下图会显示所有挂载的文件夹 宿主机和容器对应的挂载目录,上个步骤我不是手动将宿主机/home/mycentosdata挂载到容器里面的/mydockerfiledata目录嘛,所以下图第一个显示的对应关系就是如此,但是我们使用Dockerfile建立的mydockerfiledata1目录并没有使用命令指定挂载目录,所以就默认分配了一个目录
-
4.读写权限
docker run -d -it -v /home/centosdata:/centosdata:ro centos
命令中不带:ro,容器中的文件可读可写
命令中带:ro,容器中的文件只读,如下图所示
docker inspect fae237c35c06(容器ID)查看
下面演示一遍,首先在宿主机目录新建一个a.txt变写入内容,然后进入容器看是否能编辑,如下图所示
以上提示readonly,文件只读,那看来没错
docker数据卷容器
所谓数据卷容器,说白了就是活动硬盘上挂活动硬盘,实现数据上的传递依赖
-
下面以上一步新建的镜像liucong/centos为模板并运行容器lc01/lc02/lc03
-
为了区分我将之前在宿主机和容器里面所挂载的文件都删除了,下面新建挂载目录lc01,并在挂载目录里面新建文件lc01.txt
docker run -d -it --name lc01 -v /home/docker/lc01:/lc01 liucong/centos下图在宿主机/home/docker/lc01目录新建了lc01.txt文件,文件内容是create lc01,下面去容器里面查看是否存在
如下图所示,数据已经同步到容器里面
-
以上新建lc01容器,那么怎么实现数据的传递依赖呢,看下面步骤
接下来创建lc02容器,并且继承lc01,实现数据传递,如果成功,那么我们在挂载目录新建的lc01.txt在容器lc02也会出现
docker run -d -it --name lc02 --volumes-from lc01 liucong/centos如下图所示,lc02创建成功,下面我们进入lc02容器查看是否存lc01.txt
如上图所示看来真的实现了数据传递,那么猜想如果我们在宿主机新建lc02.txt,那么容器lc01,lc02都会同步,话不多说,尝试一下
如上图所示,我们已经在宿主机挂载目录新建了lc02txt,并且编辑内容为create lc02,下面我们看两个容器里面是否同步
如上图所示,容器lc01,lc02都存在lc02.txt,看来数据传递成功了,那么同理在新增lc03容器也是一样,这里就不贴图了
既然新建能够进行数据传递共享,那么删除必然可以同步.如果lc01容器被删除了,那么继承lc01的容器lc02的数据是否还存在呢?
看下图所示
结论是:依然存在
-
删除所有数据容器卷
docker volume rm $(docker volume ls -q)删除数据卷之前要停止并删除容器,否则会提示数据卷正在被使用导致删除失败,发现一个问题,就是通过命令启动并创建数据卷的容器,容器删除之后再运行,之前创建的数据卷就没有了,而通过Dockerfile方式创建的数据卷,会一直存在