Docker简介
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
一个完整的Docker有以下几个部分组成:
dockerClient客户端
Docker Daemon守护进程
Docker Image镜像
DockerContainer容器
Docker 架构
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。Docker 容器通过 Docker 镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。
Docker采用 C/S架构 Docker daemon 作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。 客户端和服务端既可以运行在一个机器上,也可通过 socket 或者RESTful API 来进行通信。
Docker daemon 一般在宿主主机后台运行,等待接收来自客户端的消息。 Docker 客户端则为用户提供一系列可执行命令,用户用这些命令实现跟 Docker daemon 交互。
一、安装docker
注:需linux系统为7.3版本的才可下载
yum install docker-engine-17.03.1.ce-1.el7.centos.x86_64.rpm docker-engine-selinux-17.03.1.ce-1.el7.centos.noarch.rpm -y
打开docker
[root@foundation10 Desktop]# systemctl start docker
二、docker基本管理命令
查看容器进程
查看在运行的容器进程
[root@foundation10 Desktop]# docker ps
查看未开启的容器进程
[root@foundation10 Desktop]# docker ps -a
删除容器
删除容器
docker kill vm1 ##强制删除
docker rm vm1
如果镜像被容器使用,需要强制删除
docker rm -f vm1
停止容器的2种方式
[root@foundation10 docker]# docker container stop vm2
[root@foundation10 docker]# docker stop vm1
查看docker版本信息
[root@foundation10 Desktop]# docker version
运行镜像
解压镜像
[root@foundation10 Desktop]# docker load -i game2048.tar
打入后台运行镜像 -d 打入后台
[root@foundation10 Desktop]# docker run -d --name vm1 game2048
交互式运行镜像 -it 交互式
[root@foundation10 docker]# docker run -it --name vm2 rhel7 bash
查看dockerIP
查看docker网卡
[root@foundation10 Desktop]# ip addr
查看docker详情(在最后查看IP以做浏览器访问测试)
[root@foundation10 Desktop]# docker inspect vm1
浏览器访问172.17.0.2(这里是通过解压game2048.tar镜像然后运行docker,查看IP,接着访问的)
删除所有停止了,但后台还有进程的容器
方法一:
[root@foundation10 docker]# docker ps ##这里进程
[root@foundation10 docker]# docker ps -a ##这里有进程
[root@foundation10 docker]# docker container prune
方法二:
[root@foundation10 netns]# docker rm -f `docker ps -aq`
[root@foundation10 netns]# docker ps -a
端口映射 通过nat的方式走的 在外网查看网址为172.25.254.10:8080
这里要先解压nginx镜像然后以打入后台的方式运行
[root@foundation10 docker]# docker run -d --name vm2 -p 8080:80 nginx
查看IP:新建vm2后IP为172.17.0.2
[root@foundation10 docker]# docker inspect vm2
"IPAddress": "172.17.0.3",
退出容器
当容器在交互式运行时
ctrl+d 退出容器
ctrl+pq 退出容器但不结束进程
连接未结束进程的交互式容器
[root@foundation10 ns]# docker container attach vm3
查看本地的镜像
[root@foundation10 docker]# docker images
数据卷的管理命令
查看-v挂载产生的数据卷
[root@foundation10 ~]# docker volume ls
清空所有数据卷
docker volume rm `docker volume ls -q`
删除单个数据卷
[root@foundation10 ~]# docker volume rm ** #**表示那一长串VOLUME NAME
二、网上获取镜像
镜像用来创建容器,是容器的只读模板,默认可以从 docker hub 上下载。docker 的镜像是
增量修改,每次创建新的镜像都会在父镜像上构建一个增量的层,基于 AUFS 技术。
镜像默认可以从 docker hub 上下载,这是 docker 官方的公共仓库,为我们免费提供了大量
已经容器化的应用镜像,避免我们重复的去造轮子。但是官方并没有在国内部署服务器,
如果你不走 vpn 的话真的是太慢了,报错和超时让人非常的郁闷。
于是我们可以通过在阿里云官网配置镜像加速器来下载镜像,很快。
镜像命令
# docker search 查询镜像
# docker pull 拉取镜像
# docker push 推送镜像
1、配置镜像加速器(阿里云注册登陆查看 https://cr.console.aliyun.com/cn-hangzhou/mirrors)
根据官网指导来做
[root@foundation10 docker]# cd /etc/docker/ ##这个目录需要自己建
[root@foundation10 docker]# ls
key.json
[root@foundation10 docker]# vim daemon.json
[root@foundation10 docker]# cat daemon.json
{
"registry-mirrors": ["https://utjfhp8l.mirror.aliyuncs.com"]
}
[root@foundation10 docker]# sudo systemctl daemon-reload
[root@foundation10 docker]# sudo systemctl restart docker
2、拉取镜像
删除之前后台的进程
[root@foundation10 docker]# docker ps
[root@foundation10 docker]# docker ps -a
[root@foundation10 docker]# docker container prune
查询镜像,找到自己需要的镜像
[root@foundation10 docker]# docker search nginx
下载镜像
拉取镜像
[root@foundation10 docker]# docker pull nginx
查看镜像
[root@foundation10 docker]# docker images nginx
运行nginx
运行nginx
[root@foundation10 docker]# docker run -d --name vm1 nginx
查看nginx信息
[root@foundation10 docker]# docker history nginx
3、在docker中修改nginx的默认发布文件
方法一:将默认发布内容传到vm1 nginx的默认发布目录下
[root@foundation10 ~]# vim index.html
<h1>www.westos.org</h1>
[root@foundation10 ~]# docker cp index.html vm1:/usr/share/nginx/html
浏览器访问172.17.0.2查看
方法二:将镜像远程挂载到本机上,通过在本机上直接修改默认发布内容来发布
[root@foundation10 ~]# mkdir /tmp/docker
[root@foundation10 ~]# cd /tmp/docker/
[root@foundation10 docker]# mkdir web
[root@foundation10 docker]# cd web/
[root@foundation10 web]# vim index.html
<h1>www.westos.org</h1>
<h1>www.westos.org</h1>
<h1>www.westos.org</h1>
<h1>www.westos.org</h1>
<h1>www.westos.org</h1>
[root@foundation10 ~]# docker run -d --name vm1 -v /tmp/docker/web:/usr/share/nginx/html nginx
这里因为前面方法一调用过vm1,所以需要删除vm1,才能运行
[root@foundation10 ~]# docker rm -f vm1
[root@foundation10 ~]# docker run -d --name vm1 -v /tmp/docker/web:/usr/share/nginx/html nginx
浏览器访问172.17.0.2查看
三、数据卷挂载
docker run 在创建容器时使用 -v 参数可以挂载一个或多个数据卷到当前运行的容器中,-v
的作用是将宿主机上的目录作为容器的数据卷挂载到容器中,使宿主机和容器之间可以共
享一个目录。
1、挂载数据卷到新创建的容器上
默认挂载可以读写数据卷,也可以只读挂载:这里data1可以读写,data2和yum源目录只读挂载
[root@foundation10 ~]# docker run -it --name vm1 -v /tmp/data1:/data1 -v /tmp/data2:/data2:ro -v /etc/yum.repos.d/rhel-dvd.repo:/etc/yum.repos.d/rhel-dvd.repo:ro rhel7 bash
-v 参数可以重复使用,挂载多个数据卷到容器中,冒号前面的是宿主机的目录(本地目录
不存在 docker 会自动创建),冒号后面的是容器中的挂载目录。
注:docker commit 时卷的数据不会被保存。
bash-4.2# df
bash-4.2# ls -l
bash-4.2# cd /etc/yum.repos.d/
bash-4.2# cat rhel-dvd.repo
bash-4.2# yum repolist
bash-4.2# cd /data2
bash-4.2# touch file
touch: cannot touch 'file': Read-only file system
bash-4.2# cd /data1/
bash-4.2# touch file1
bash-4.2# ls
file1
2、数据卷容器:
停止vm1
[root@foundation10 web]# docker rm -f vm1
创建vm1
[root@foundation10 web]# docker create --name datavol -v /tmp/data1:/data1 -v /tmp/data2:/data2:ro -v /etc/yum.repos.d/rhel-dvd.repo:/etc/yum.repos.d/rhel-dvd.repo:ro rhel7 bash
运行vm1
[root@foundation10 web]# docker run -it --name vm1 --volumes-from datavol rhel7 bash
3、备份数据卷:
解压ubuntu镜像
[root@foundation10 web]# cd /home/kiosk/Desktop/docker/
[root@foundation10 docker]# docker load -i ubuntu.tar
数据卷备份
[root@foundation10 docker]# docker run --rm -v /tmp/backup:/backup ubuntu tar cf /backup/etc.tar /etc
[root@foundation10 docker]# cd /tmp/backup/
[root@foundation10 backup]# ls
etc.tar
以上是 -v 参数后面加本地目录的情况,如果不加系统目录,直接将数据卷挂载到容器中呢?
如果-v后面不跟系统目录 容器会帮我们自动分配,挂载数据卷
实验一:
[root@foundation10 ~]# docker run -it --name vm1 -v /data1 ubuntu
ctrl+pq退出,用df查看挂载的数据卷
root@dbd22d30f018:/# [root@foundation10 ~]# df
查看数据卷
[root@foundation10 ~]# docker volume ls
进到挂载目录读写操作
查看地址
[root@foundation10 ~]# docker inspect vm1 | grep vol
进到目录
[root@foundation10 ~]# cd /var/lib/docker/volumes/b3e61f528cf83e7269e19943741d0a71e03922cc33930441a8d25891fa5dad66/_data
[root@foundation10 _data]# ls
复制其他内容到该目录
[root@foundation10 _data]# cp /etc/passwd .
[root@foundation10 _data]# ls
passwd
此时在另一个shell中连接vm1,在data目录能够看到复制的文件
[root@foundation10 ~]# docker container attach vm1
root@dbd22d30f018:/# cd data1/
root@dbd22d30f018:/data1# ls
passwd
实验二:
先将vm1和数据卷删除
docker rm -f vm1
[root@foundation10 ~]# docker volume rm ** ()这里的**是用docker volume ls 查看的vm1的volume name
挂载数据卷
[root@foundation10 ~]# docker run -d --name vm2 -v /usr/share/nginx/html nginx
查看容器
[root@foundation10 ~]# docker ps
查看vm2的数据卷地址
[root@foundation10 ~]# docker inspect vm2 | grep vol
[root@foundation10 ~]# cd /var/lib/docker/volumes/2ebded2d6e5f1d1a81a2226db1fd1815dfeeb0c46c6c124c308d1b71d33bb572/_data
[root@foundation10 _data]# ls
50x.html index.html
删除数据卷
[root@foundation10 ~]# docker volume rm 2ebded2d6e5f1d1a81a2226db1fd1815dfeeb0c46c6c124c308d1b71d33bb572
便不能进入数据卷目录了
把静态数据放进镜像 ,镜像挂载到容器的使用,结合Dockerfile看下一篇博客
四、容器间互联
–link 参数可以在不映射端口的前提下为两个容器间建立安全连接, –link 参数可以连接一个
或多个容器到将要创建的容器。
–link 参数的格式为 –link vm1:nginx,其中 name 是要链接的容器的名称,nginx 是这个连
接的别名。
容器端口映射
[root@foundation10 netns]# docker run -d --name vm1 -p 8080:80 nginx
Docker 的端口映射是由 iptables 来实现的:
[root@foundation10 netns]# iptables -t nat -nL
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080 to:172.17.0.2:80
容器间互联
[root@foundation10 netns]# docker run -it --name vm2 --link vm1:nginx ubuntu
root@d739ad574ab1:/# env
root@d739ad574ab1:/# cat /etc/hosts