知识点:
1)docker简介
2)docker安装,仓库配置
3)docker仓库镜像拉取,导出,导入,删除
4)docker容器操作,容器的创建,删除,运行,停止,日志查看等。
5) docker网络,存储
例:
docker run -d --name mynginx_2 -v /data/d:/data/c -p 80:80 -p 443:443 mynginx:v1
1.Docker简介和KVM区别
1.1 历史简介
Docker是PaaS供应商dotCloud开源的一个基于LXC 的高级容器引擎,源代码托管在 GitHub 上, 基于Go语言开发并遵从Apache 2.0协议开源.Docker 是通过内核虚拟化技术(namespaces及cgroups等,这里的内核技术指的是Linux内核哦)来提供容器的资源隔离与安全保证等。由于docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要额外的虚拟化管理程序(VMM(Virtual Machine Monitor),以及hyperisor)支持,他是内核级虚拟化,可以实现更高的性能,同时对资源的额外需求很低。最本质特征docker是通过隔离来进行创建容器,而KVM等均为通过模拟方式创建虚拟机
1.2 优势说明
更快的交付和部署
使用docker 开发人员可以使用镜像来快速构建一套标准的开发环境;开发完成之后,测试和运维人员可以直接使用完全相同的环境来部署代码,只要开发测试过的代码,就可以确保在生产环境无缝运行。docker可以快速创建和删除容器,实现快速迭代,大量节约开发、测试、部署的时间
更高效的资源利用
docker 容器不需要额外的虚拟化管理程序支持,他是内核级的虚拟化,可以实现更高级的性能,同时对资源的额外需求很低
更轻松的迁移和扩展
docker容器几乎可以再任意的平台上运行,包括物理机、虚拟机、公有云、私有云、
个人电脑、服务器等,同事支持主流的操作系统发行版本。这种兼容性让用户可以在
不同平台之间轻松地迁移应用
1.3 对比KVM
docker容器很快,启动和停止可以再秒级实现,而传统的虚拟机需要数分钟
docker容器对系统资源需求很少,一台主机上可以同时运行数百甚至上千个docker容
器
docker 通过类似于git的设计理念的操作来方便用户获取、分发和更新应用镜像,存储
复用,增量更新
docker通过dockerfile支持灵活的自动化创建和部署机制,提高工作效率,使流程标准化
1.4 docker的特性
Docker的三大特性为BUILD(构建)、SHIP(运输)、RUN(运行)。(一次构建多处运行,像不像JAVA呢)。docker是传统的CS架构分为docker client和docker server,主要分为三大组件镜像(image)、容器(container)、仓库(Repository)。那么docker和我们之前接触的openstack又有什么区别呢?他们的区别如下所示。
2.安装与配置
2.1 安装
# yum install docker -y # systemctl enable docker # Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
2.2 配置三方仓库(当然也可以直接使用,不过有点慢而已)
本例使用的是阿里云容器镜像服务中的镜像加速器,使用加速器可以提升获取Docker官方镜像的速度
https://y4869biq.mirror.aliyuncs.com 是我的加速器地址
操作步骤
1. 安装/升级Docker客户端
推荐安装1.10.0以上版本的Docker客户端,参考文档如下
2. 配置镜像加速器
针对Docker客户端版本大于 1.10.0 的用户
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://y4869biq.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
systemctl status docker
docker默认储存路径
[root@mytest logs]# ls /var/lib/docker/
containers image network overlay2 plugins swarm tmp trust volumes
更换存储目录
vim /usr/lib/systemd/system/docker.service
ExecStart对应处添加--graph=/opt/docker参数
docker的dns服务
(默认docker是采用宿主机的dns,如果要修改docker的dns方法有两种,一种是直接修改宿主机的dns,另一种是添加--dns=xxxx的方式指定。)
systemctl daemon‐reload
systemctl docker restart
docker daemon --help 这里可以查看到所有支持的参数
3.Docker快速入门
3.1镜像操作
就和我们之前学过的openstack一样,我们需要一个镜像才能够启动容器,从而对
查看镜像
docker search nginx
拉取镜像
docker pull alpine
默认情况下会拉取 latest 版本
以上是我们在服务器能够联网的情况下获取镜像的方法,docker 默认也提供了离线方式
镜像导出
docker save centos > /opt/centos.tar.gz
默认我们导出成tar.gz形式,当然我们也可以通过tar命令进行解压,解压之后我们可以
镜像导入
docker load < /opt/centos.tar.gz
查看本机存在镜像
docker images
查看容器的详细信
docker inspect
删除镜像
docker rmi alpine
实例:
搜索镜像
[root@mytest logs]# docker search alpine INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED docker.io docker.io/alpine A minimal Docker image based on Alpine Lin... 4141 [OK] docker.io docker.io/mhart/alpine-node Minimal Node.js built on Alpine Linux 374 docker.io docker.io/anapsix/alpine-java Oracle Java 8 (and 7) with GLIBC 2.23 over... 342 [OK] docker.io docker.io/gliderlabs/alpine Image based on Alpine Linux will help you ... 176 docker.io docker.io/frolvlad/alpine-glibc Alpine Docker image with glibc (~12MB) 160 [OK]
拉取镜像
[root@mytest logs]# docker rmi alpine Untagged: alpine:latest Deleted: sha256:11cd0b38bc3ceb958ffb2f9bd70be3fb317ce7d255c8a4c3f4af30e298aa1aab Deleted: sha256:73046094a9b835e443af1a9d736fcfc11a994107500e474d0abf399499ed280c [root@mytest logs]# docker pull alpine Using default tag: latest Trying to pull repository docker.io/library/alpine ... latest: Pulling from docker.io/library/alpine 8e3ba11ec2a2: Pull complete Digest: sha256:7043076348bf5040220df6ad703798fd8593a0918d06d3ce30c6c93be117e430 Status: Downloaded newer image for docker.io/alpine:latest
查看本机存在镜像
[root@mytest logs]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/alpine latest 11cd0b38bc3c 7 weeks ago 4.41 MB
导出镜像
[root@mytest logs]# docker save alpine >/tmp/alpine.tar.gz [root@mytest logs]# ls /tmp/ alpine.tar.gz
删除镜像
[root@mytest logs]# docker rmi alpine Untagged: alpine:latest Untagged: docker.io/alpine@sha256:7043076348bf5040220df6ad703798fd8593a0918d06d3ce30c6c93be117e430 Deleted: sha256:11cd0b38bc3ceb958ffb2f9bd70be3fb317ce7d255c8a4c3f4af30e298aa1aab Deleted: sha256:73046094a9b835e443af1a9d736fcfc11a994107500e474d0abf399499ed280c [root@mytest logs]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE
导入镜像
[root@mytest logs]# docker load < /tmp/alpine.tar.gz 73046094a9b8: Loading layer [==================================================>] 4.672 MB/4.672 MB Loaded image: docker.io/alpine:latest [root@mytest logs]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/alpine latest 11cd0b38bc3c 7 weeks ago 4.41 MB
3.2容器操作
显示正在运行的容器有哪些
docker ps docker ps -a 显示所有容器
创建一个容器
docker run centos echo "Hello Wolrd"
其实run 等于create + start 不过我们通常都会用run的方式
[root@mytest logs]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/alpine latest 11cd0b38bc3c 7 weeks ago 4.41 MB
创建并启动容器alpine,-it表示可交互式,--name danny指定容器名称,便于识别
[root@mytest logs]# docker run -it --name danny alpine sh (因为alpine镜像很小,可能很多命令是没有的) / # ls bin etc lib mnt root sbin sys usr dev home media proc run srv tmp var / # cd /tmp/ /tmp # ls /tmp # mkdir danny /tmp # touch test.txt /tmp # ls danny test.txt /tmp # echo "123" >test.txt /tmp # cat test.txt 123 /tmp # exit [root@mytest logs]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
(注:以上docker为前台进程,退出控制台,进程也退出,所以docker ps显示无docker进程运行。)
[root@mytest logs]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@mytest logs]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fa86ec737406 alpine "sh" 5 minutes ago Exited (0) 3 minutes ago trusting_jepsen 15d3cc7d3ee3 alpine "sh" 10 minutes ago Exited (0) 10 minutes ago romantic_babbage ea181e0f32bc alpine "sh" 16 minutes ago Exited (0) 11 minutes ago affectionate_knuth d212402edb3a alpine "echo 'Hello World..." 16 minutes ago Exited (0) 16 minutes ago angry_mestorf 24e088998106 alpine "echo 'Hello World'" 17 minutes ago Exited (0) 17 minutes ago happy_austin
删除容器
[root@mytest logs]# docker rm fa86ec737406 15d3cc7d3ee3 ea181e0f32bc d212402edb3a fa86ec737406 15d3cc7d3ee3 ea181e0f32bc d212402edb3a [root@mytest logs]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 24e088998106 alpine "echo 'Hello World'" 22 minutes ago Exited (0) 22 minutes ago happy_austin
nginx镜像容器实例:
拉取nginx镜像
[root@mytest logs]# docker pull nginx Using default tag: latest Trying to pull repository docker.io/library/nginx ... latest: Pulling from docker.io/library/nginx be8881be8156: Pull complete 32d9726baeef: Pull complete 87e5e6f71297: Pull complete Digest: sha256:d85914d547a6c92faa39ce7058bd7529baacab7e0cd4255442b04577c4d1f424 Status: Downloaded newer image for docker.io/nginx:latest [root@mytest logs]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/nginx latest c82521676580 4 weeks ago 109 MB
docker网络访问
[root@izm5edykqg8tzid352ga0iz ~]# docker run -i -P -d --name mynginx nginx //-P:随机映射 4feb1d426b6f1c04740e693339a7e3072dc958aaa338d35d484da33b1b48632c [root@izm5edykqg8tzid352ga0iz ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4feb1d426b6f nginx "nginx -g 'daemon ..." 7 seconds ago Up 6 seconds 0.0.0.0:32768->80/tcp mynginx 696cd0ad637b centos "bash" 3 hours ago Up 3 hours hopeful_brahmagupta (此处对于docker的nginx容器,宿主机使用了随机端口32768映射到容器内部的80端口,所以在物理机直接访问80是没办法访问的,只能通过宿主机的映射端口访问)
[root@izm5edykqg8tzid352ga0iz ~]# curl -I http://localhost:32768 HTTP/1.1 200 OK Server: nginx/1.15.3 Date: Mon, 03 Sep 2018 06:13:26 GMT Content-Type: text/html Content-Length: 612 Last-Modified: Tue, 28 Aug 2018 13:32:13 GMT Connection: keep-alive ETag: "5b854edd-264" Accept-Ranges: bytes -p指定映射 -p hostPort:containerPort -p ip:hostPort:containerPort -p ip:containerPort -p hostPort:containerPort:udp [root@izm5edykqg8tzid352ga0iz ~]# docker run -d -p 81:80 --name mynginx nginx e7f1f7d76ec3ce1db6fb0f05d13b5b7b17bbf9971e4eec2102bc160a8c89d009 [root@izm5edykqg8tzid352ga0iz ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e7f1f7d76ec3 nginx "nginx -g 'daemon ..." 11 seconds ago Up 10 seconds 0.0.0.0:81->80/tcp mynginx 696cd0ad637b centos "bash" 3 hours ago Up 3 hours [root@izm5edykqg8tzid352ga0iz ~]# curl -I http://localhost:81 HTTP/1.1 200 OK ... 当然也可通过外网访问 [root@izm5edykqg8tzid352ga0iz ~]# curl -I http://外网IP:81 HTTP/1.1 200 OK ...
docker 多端口映射
[root@izm5edykqg8tzid352ga0iz data]# docker run -d -p 443:443 -p 80:80 --name mynginx_3 mynginx:v2 ebc7461617dfd111de753a2c2168ff5499a3481e8617e97d0381051432884c43 [root@izm5edykqg8tzid352ga0iz data]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ebc7461617df mynginx:v2 "nginx" 7 seconds ago Up 6 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp mynginx_3 [root@izm5edykqg8tzid352ga0iz data]# curl http://公网ip hello world
docker数据存储
数据卷
格式:
-v /data
-v src:dst //docker run -it --name volume-test1 -v /opt:/opt centos
# src :宿主机挂载目录
# dst :容器挂载目录
[root@izm5edykqg8tzid352ga0iz mysql]# docker run -it --name volume-test1 -v /data/dockerdata centos [root@83e4dbd4cba3 /]# [root@izm5edykqg8tzid352ga0iz /]# docker inspect volume-test1 ... "Mounts": [ { "Type": "volume", "Name": "1858f2f7abfb232f6d17f7782c6b304c6994a1b26f22e35dce4ff65a811f3d67", "Source": "/var/lib/docker/volumes/1858f2f7abfb232f6d17f7782c6b304c6994a1b26f22e35dce4ff65a811f3d67/_data", "Destination": "/data/dockerdata", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ], ...
上面可以看到该docker容器空间是挂载在物理机的/var/lib/docker/volumes/1858f2f7abfb232f6d17f7782c6b304c6994a1b26f22e35dce4ff65a811f3d67/_data目录下的
在docker上的挂载点是/data/dockerdata
数据卷容器(将一个容器的目录挂载到另一个容器)
--volumes-from
[root@izm5edykqg8tzid352ga0iz mysql]# docker run -d --name danny -v /data centos94136a5214b0c66de54a547e97c30825ab17e814f5d8dd61af8cd6c65f1ba284 [root@izm5edykqg8tzid352ga0iz mysql]# docker run -it --name jeck --volumes-from danny centos [root@0da6f925f521 /]#
进入容器方式
方法一:(常用+推荐)
获取容器pid [root@izm5edykqg8tzid352ga0iz ~]# docker inspect --format {{.State.Pid}} 696cd0ad637b 22132 [root@izm5edykqg8tzid352ga0iz ~]# docker inspect --format {{.State.Pid}} mynginx 31634 [root@izm5edykqg8tzid352ga0iz ~]# nsenter -t 22132 -u -i -n -p //如果没有nsenter命令需要安装util-linux [root@696cd0ad637b ~]# (退出后容器进程不退出,可对应写一个脚本进入) 例: #!/bin/bash PID=$(docker inspect --format "{{.State.Pid}}" $1) nsenter -t $PID -u -i -n -p
[root@izm5edykqg8tzid352ga0iz ~]# chmod +x docker.sh [root@izm5edykqg8tzid352ga0iz ~]# sh docker.sh d3763d3b1c72 [root@d3763d3b1c72 ~]#
方法二: [root@mytest ~]# docker exec -it mynginx sh (退出后容器进程也退出) 方法三: [root@mytest ~]# docker attach mynginx (缺点:多终端界面同步)
docker 容器重命名
docker rename 原容器名 新容器名
kill掉所有正在运行的容器
[root@izm5edykqg8tzid352ga0iz ~]# docker kill $(docker ps -a -q)
-d参数守护状态运行
[root@mytest logs]# docker run -d --name mynginx nginx 2d39f9bd66b168577bf963cf183e211d4e8ba73efb500324b4a6fc2208897e30 [root@mytest logs]# [root@mytest logs]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2d39f9bd66b1 nginx "nginx -g 'daemon ..." 26 seconds ago Up 26 seconds 80/tcp mynginx
停止后台运行的docker容器
[root@mytest logs]# docker stop mynginx
mynginx
查看容器后台访问日志
[root@mytest logs]# docker logs mynginx 172.17.0.1 - - [28/Aug/2018:09:41:10 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
实时动态查看docker容器日志
[root@mytest logs]# docker logs mynginx -f