Docker基础入门
官网下载速度太慢,使用国内镜像节点下载:Docker镜像下载链接
配置阿里云镜像地址:阿里云镜像配置
一、安装验证
- 版本号:
docker --version
docker-compose --version
- docker配置信息:
docker info
- docker run 来在容器内运行一个应用程序
docker run ubuntu:15.10 /bin/echo "Hello world"
各个参数方法:
docker: Docker 的二进制执行文件。
run: 与前面的 docker 组合来运行一个容器。
ubuntu:15.10 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
/bin/echo “Hello world”: 在启动的容器里执行的命令 - 查看下载的镜像文件
docker images
二、基本命令总结
1、镜像命令
-
查看现有镜像
docker images
可选项:
docker images -all
:列出所有的镜像
docker images -quiet
:只显示镜像id
docker images -f
: -
搜索镜像
docker search mysql
可选项:
docker search mysql --filter=STARS=3000
:列出搜索大于3000的镜像
-
下载镜像
docker pull 镜像名[:tag]
指定版本下载:git pull mysql:5.7.5
-
删除镜像
docker rmi -f [IMAGE ID]
删除单个:docker rmi -f e1d7dc9731da
批量删除:docker rmi -f $(docker images -aq)
2、容器命令
- 下载一个镜像创建容器:
docker pull centos
- 新建容器并启动:
docker run [可选参数] image
// 参数说明
–name=“Name” 容器名称
-d: 后台运行(后台没有进程会自动关闭)
-it: 使用交互方式运行(可进入容器查看哪内容)
-p: 容器端口 -p 8080:8080(主机端口:容器端口)-P: 随机指定端口
- 启动并进入容器:
docker run -it centos /bin/bash
- 查看正在运行的容器:
docker ps
曾经所有运行的容器:docker ps -a
指定显示容器个数:docker ps -a -n=1
只显示容器编号:docker ps -aq
- 退出容器
Ctrl + P + Q 容器不停止退出
exit 容器停止并退出
- 删除容器
docker rm [容器id]
删除指定的容器
docker rm -f $(docker ps -aq)
-f 递归删除所有的容器 - 启动和停止容器
docker start [容器id]
启动容器
docker restart [容器id]
重启容器
docker stop [容器id]
停止容器
docker kill [容器id]
强行停止容器
3、常用的命令
- 后台启动容器:
docker run -d centos
- 查看日志:
docker logs -f -t --tail 10 a06673a6aa43
-t -f 显示全部日志
–tail 10 日志id 显示10条log
- 查看容器中进程信息:
docker top 容器id
- 查看镜像元数据:
docker inspect 容器id
[
{
"Id": "a06673a6aa43c47a5517574cb77c5867c3f6632b6c427877e8ce4acf9f855d23", // 容器id
"Created": "2020-10-03T03:14:17.0791137Z", // 创建时间
"Path": "bin/bash",
"Args": [], // 脚本内容
"State": {
"Status": "running", // 当前容器状态
"Running": true, // running
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 3031, // 父进程id
"ExitCode": 0,
"Error": "",
"StartedAt": "2020-10-03T03:14:17.446815Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:0d120b6ccaa8c5e149176798b3501d4dd1885f961922497cd0abef155c869566",
"ResolvConfPath": "/var/lib/docker/containers/a06673a6aa43c47a5517574cb77c5867c3f6632b6c427877e8ce4acf9f855d23/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/a06673a6aa43c47a5517574cb77c5867c3f6632b6c427877e8ce4acf9f855d23/hostname",
"HostsPath": "/var/lib/docker/containers/a06673a6aa43c47a5517574cb77c5867c3f6632b6c427877e8ce4acf9f855d23/hosts",
"LogPath": "/var/lib/docker/containers/a06673a6aa43c47a5517574cb77c5867c3f6632b6c427877e8ce4acf9f855d23/a06673a6aa43c47a5517574cb77c5867c3f6632b6c427877e8ce4acf9f855d23-json.log",
"Name": "/vibrant_heyrovsky",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"CapAdd": null,
"CapDrop": null,
"Capabilities": null,
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "private",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "runc",
"ConsoleSize": [
0,
0
],
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"NanoCpus": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": [],
"BlkioDeviceReadBps": null,
"BlkioDeviceWriteBps": null,
"BlkioDeviceReadIOps": null,
"BlkioDeviceWriteIOps": null,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": [],
"DeviceCgroupRules": null,
"DeviceRequests": null,
"KernelMemory": 0,
"KernelMemoryTCP": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": null,
"OomKillDisable": false,
"PidsLimit": null,
"Ulimits": null,
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0,
"MaskedPaths": [
"/proc/asound",
"/proc/acpi",
"/proc/kcore",
"/proc/keys",
"/proc/latency_stats",
"/proc/timer_list",
"/proc/timer_stats",
"/proc/sched_debug",
"/proc/scsi",
"/sys/firmware"
],
"ReadonlyPaths": [
"/proc/bus",
"/proc/fs",
"/proc/irq",
"/proc/sys",
"/proc/sysrq-trigger"
]
},
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/0bc87d0fd553b5eaac36ecb258f1cb0d1eb5d7ec9f3135f1f13099acd534a5d1-init/diff:/var/lib/docker/overlay2/bd7f7d5693967ba90aa360babc06138c67b4f55ad1b89f1e53842b3acd421eec/diff",
"MergedDir": "/var/lib/docker/overlay2/0bc87d0fd553b5eaac36ecb258f1cb0d1eb5d7ec9f3135f1f13099acd534a5d1/merged",
"UpperDir": "/var/lib/docker/overlay2/0bc87d0fd553b5eaac36ecb258f1cb0d1eb5d7ec9f3135f1f13099acd534a5d1/diff",
"WorkDir": "/var/lib/docker/overlay2/0bc87d0fd553b5eaac36ecb258f1cb0d1eb5d7ec9f3135f1f13099acd534a5d1/work"
},
"Name": "overlay2"
},
"Mounts": [], // 挂载
"Config": {
"Hostname": "a06673a6aa43", // 容器id缩写
"Domainname": "",
"User": "",
"AttachStdin": true,
"AttachStdout": true,
"AttachStderr": true,
"Tty": true,
"OpenStdin": true,
"StdinOnce": true,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"bin/bash"
],
"Image": "centos",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20200809",
"org.label-schema.license": "GPLv2",
"org.label-schema.name": "CentOS Base Image",
"org.label-schema.schema-version": "1.0",
"org.label-schema.vendor": "CentOS"
}
},
"NetworkSettings": { // 网络的配置
"Bridge": "",
"SandboxID": "27200b989193b45e8da2b1c44b07b823fb7a16cf22eb91a299ffd93b5dc5b733",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/27200b989193",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "8ce5229043104fe0a2f7440a8910f1055b2299f6604d7e45ecd3a3ac88908db4",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "5ad60df7dcdd38897edd63387153b0ff7ff9e292e2df9444609a3ec93bb35d7f",
"EndpointID": "8ce5229043104fe0a2f7440a8910f1055b2299f6604d7e45ecd3a3ac88908db4",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
}
}
}
}
]
- 进入正在运行的容器:
方式一:docker exec -it 容器id /bin/bash
方式二:docker attach 容器id
进入正在执行的终端 - 容器内拷贝文件:
docker cp 【容器id】:【需要cp的文件路径】 【拷贝出来的存放路径】
三、基本的部署
1、部署Nginx
-
搜索镜像:
docker search nginx
-
下载镜像:
docker pull nginx
-
查看镜像:
docker images
-
运行镜像:
docker run -d --name nginx01 -p 3344:80 nginx
(3344:80 代表 ‘外网端口号:容器内端口号’)
-
查看运行镜像:
docker ps
-
本机自测:
curl localhost:3344
-
容器内启动的
80端口号
的nginx映射到外部的3344端口服务
上了
-
映射关系
2、部署Tomcat
docker run -it --rm tomcat:9.0
停止后删除容器- 启动容器:
docker run -d -p 3355:8080 --name tomcat01 tomcat
- docker下载镜像默认是最小的,所以webapps为空,复制webapps.dist到webapps
cp -r webapps.dist/* webapps
- 成功访问到tomcat
3、部署elasticsearch + Kibana
-
下载容器:
docker pull elasticsearch
docker pull kibana
-
启动elasticsearch:
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -p 5601:5601 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch
ES_JAVA_OPTS="-Xms64m -Xmx512m" 设置最大占用内存
如上显示表明ES安装成功,接下来我们需要安装可视化界面kibana -
启动kibana:
docker run -it -d -e ELASTICSEARCH_URL=http://localhost:9200 --name kibana --network=container:elasticsearch kibana
network=container:elasticsearch
container
是docker网络模式的一种,表示和指定容器共用一个网卡, 使用方式:network = container:容器名_or_容器id
(网桥模式参见docker网络章节)
请求:localhost:5601/app/kibana出现如下界面说明配置成功
- ES连接Kibana流程
四、可视化面板portainer
运行启动:docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
五、Commit
- 提交命令:
docker commit -m="提交信息" -a="作者" 容器id 目标镜像名:Tag
- 提交自己的镜像:
docker commit -a="jesse.tang" -m="add webapps msg" ef38edf002af tomcat01:1.0
六、容器数据卷
容器间数据共享技术,docker容器中产生的数据,同步到本地!
容器持久化和同步操作,容器间数据共享
-
挂载方式:直接使用命令挂载-v
docker run -it -v 主机目录:容器目录 容器 /bin/bash
测试:
docker run -it --name centos01 -v /Users/touyoshitaka/Documents/docker_data:/home centos /bin/bash
-
部署并同步MySQL数据
(1)启动容器docker run -d -p 3310:3306 -v /Users/touyoshitaka/Documents/docker_mysql/conf:/etc/mysql/conf.d -v /Users/touyoshitaka/Documents/docker_mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql
mysql密码:-e MYSQL_ROOT_PASSWORD=123456
同步配置:-v /Users/touyoshitaka/Documents/docker_mysql/conf:/etc/mysql/conf.d
同步数据:-v /Users/touyoshitaka/Documents/docker_mysql/data:/var/lib/mysql
(2)本地连接测试:
(3)测试数据同步:
本机新建test
数据库 -》同步文件夹下新增test
目录
1、具名挂载和匿名挂载
-
匿名挂载
-v 容器内路径
docker run -d -P -v /etc/nginx --name nginx11 nginx
DRIVER VOLUME NAME
local 19b0cf512f1c2648ccae3c01711a67c144f656a4082e43c977c573c2bb7ef9fb -
具名挂载
-v 卷名:容器内路径
docker run -d -P -v juming-nginx:/etc/nginx --name nginx11 nginx
docker vloume ls
- 挂载路径
docker volume inspect juming-nginx
-
读写权限(设置后容器会限制权限)
- 只读:
-v 卷名:容器内路径:ro
此路径只能通过宿主机修改,容器内不可修改
docker run -d -P -v juming-nginx:/etc/nginx:ro --name nginx11 nginx
- 读写:
-v 卷名:容器内路径:rw
docker run -d -P -v juming-nginx:/etc/nginx:rw --name nginx11 nginx
- 只读:
七、DockerFile
用来构建镜像
前两章说的docker commit 镜像
是手动创建
1、构建Dockerfile实现步骤
- 创建镜像文件:
vim [文件名]
vim dockerfile1
// 文件指令都是大写的参数
FROM centos
VOLUME ["volume01","volume02"] // 挂载匿名数据卷
CMD echo "=====end====="
CMD /bin/bash
-
执行文件脚本:
docker build -f [dockerfile文件路径] -t [容器名称]
docker build -f /Users/touyoshitaka/Documents/docker_dockerfile/dockerfile1 -t jesse/centos:1.0 .
-
启动自己容器:
docker run -it [容器id] /bin/bash
-
查看容器挂载路径:
docker inspect [容器ID] -》 Mounts
2、容器间共享数据
多个容器共享数据
父容器:docker run -it --name centes01 jesse/centos:1.0
子容器:docker run -it --name centes02 --volumes-from centos01 jesse/centos:1.0
继承容器:--volumes-from [父容器]
mysql 数据同步
父容器:
docker run -d -p 3310:3306 -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 jesse/mysql:1.0
子容器:docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql02 jesse/mysql:1.0
3、DockerFile指令
FROM # 基础镜像
MAINTAINER # 镜像作者 姓名 + 邮箱
RUN # 运行镜像构建的命令
ADD # 步骤:Tomcat镜像,这个Tomcat压缩包,添加内容。
WORKWORKDIR # 工作目录
VOLUME # 挂载目录
EXPOSE # 暴露端口
CMD # 指定这个容器启动运行的命令,最后一个被执行,可被代替(执行命令启动的命令会覆盖dockerfile中CMD的命令)
ENTRYPOINT # 指定这个容器启动运行的命令,可以追加命令
ONBUILD # 构建一个dockerfile会触发这个命令
COPY # 类似ADD,文件拷贝到镜像中
ENV # 构建环境变量
4、构建centos镜像
-
制作脚本
-
制作脚本:
(1)进入dockerfile目录:docker build -f [dockerfile] -t [镜像名称] .
(2)运行:
docker run -it [IMAGE ID]
(3)镜像构架过程/历史:
5、构建Tomcat镜像
准备镜像文件和jdk压缩包(tomcat依赖java环境)
(1)构建Dockerfile:
FROM centos // 基础镜像
MAINTAINER jesse<1430482733@qq.com>
COPY README.md /usr/local/README.md // copy
ADD apache-tomcat-9.0.39.tar.gz /usr/local/ //解压缩tomcat到/usr/local下
ADD jdk-8u212-linux-x64.tar.gz /usr/local/
RUN yum -y install vim // 安装vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
// 配置环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_212
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.39
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.39
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
// 端口号
EXPOSE 8080
// 启动tomcat && 打印日志
CMD /usr/local/apache-tomcat-9.0.39/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.39/bin/logs/catalina.out
(2)构建dockerfile镜像:
默认名称Dockerfile,不需要指定file路径,会自动寻找该路径下的Dockerfile文件
docker build -t [镜像名] .
(3)执行命令:
docker run -d -p 8080:8080 --name jessetomcat -v /Users/touyoshitaka/Documents/docker_dockerfile/tomcat/tomcat_data:/usr/local/apache-tomcat-9.0.39/webapps -v /Users/touyoshitaka/Documents/docker_dockerfile/tomcat/tomcat_logs:/usr/local/apache-tomcat-9.0.39/logs diy_tomcat
# 基本参数: docker run -d -p 8080:8080 --name jessetomcat
# webapps挂载: -v /Users/touyoshitaka/Documents/docker_dockerfile/tomcat/tomcat_data:/usr/local/apache-tomcat-9.0.39/webapps/test
# logs挂载: -v /Users/touyoshitaka/Documents/docker_dockerfile/tomcat/tomcat_logs:/usr/local/apache-tomcat-9.0.39/logs
# 镜像: diy_tomcat
6、发布镜像到阿里云
- 创建镜像仓库
- 上传下载镜像,如下图
八、Docker网络
1、自定义网络
原本容器间网络是不互通的,自定义网络可以使容器ping通过,这个网络就相当于一个路由,配置相同的路由网段相同,所有可以使容器互通。
- 创建一个内网(可以理解为一个路由)
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
docker network ls
查看当前所有network
--net mynet
指定使用自己的网络 (容器使用同一个网络网段互通)
docker inspect mynet
查看自定义网络中挂载的容器
2、网络连通
- 启动一个新的容器,默认网卡:
docker run -d -P --name tomcat-docker0 tomcat01:1.0
- 将tomcat-docker0挂载到mynet上:
docker network connect mynet tomcat-docker0
- 查看mynet详细信息:
docker inspect mynet
- 测试网络连通
docker exec -it tomcat-docker0 ping tomcat-net03