Docker简介
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
docker文档:https://docs.docker.com
镜像:docker镜像就好比是一个可执行程序,可以启动这个程序进而启动服务,通过这个镜像可以创建多个容器。
容器:Docker利用容器技术,独立运行一个或者一组应用,通过容器来创建。把容器可以理解为一个简易的linux系统。
仓库:仓库就是存放镜像的地方。
Docker安装
1、创建虚拟机centos7
2、关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
3、关闭selinux
#临时关闭
setenforce 0
sed -i 's/SELINUX-enforcing/SELINUX=disabled/g'
#永久关闭
vim /etc/selinux/config
SELINUX=disabled
4、配置时间同步
#修改时区
timedatectl set-timezone Asia/Shanghai
#安装ntp
yum install -y ntp ntpdate
#时间同步ntp服务器
ntpdate cn.pool.ntp.org
5、安装基础软件包
需要的安装包yum install -y yum-utils
yum install -y wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-devel python-devel epel-release openssh-server socat ipvsadm conntrack
6、安装docker-ce
- 配置docker-ce国内yum源(阿里云)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 安装docker依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
- 安装docker-ce
yum install docker-ce -y
7、启动docker服务
systemctl start docker && systemctl enable docker
systemctl status docker #看到running说明正常启动
8、开启包转发功能和修改内核参数
modprobe br_netfilter
进入/etc/sysctl.d目录创建docker.conf文件
执行如下命令
cat > /etc/sysctl.d/docker.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
让配置生效
sysctl -p /etc/sysctl.d/docker.conf
Docker命令
镜像命令
docker images 查看所有本地的主机上的镜像
[root@localhost zly]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 19 months ago 13.3kB
#解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的ID
GREATED 镜像的创建时间
SIZE 镜像的大小
# 可选项
-a,-all 列出所有镜像
-q,-quiet 只显示id
docker search 搜索镜像
[root@localhost zly]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 14091 [OK]
mariadb MariaDB Server is a high performing open sou… 5382 [OK]
phpmyadmin phpMyAdmin - A web interface for MySQL and M… 788 [OK]
percona Percona Server is a fork of the MySQL relati… 606 [OK]
bitnami/mysql Bitnami MySQL Docker Image 85 [OK]
#可选项
-f,--filter 搜索过滤
docker pull 下载镜像
[root@localhost zly]# docker pull mysql
Using default tag: latest #如果不写tag,默认就是最新
latest: Pulling from library/mysql
328ba678bf27: Pull complete #分层下载(可共用)
f3f5ff008d73: Pull complete
dd7054d6d0c7: Pull complete
70b5d4e8750e: Pull complete
cdc4a7b43bdd: Pull complete
a0608f8959e0: Pull complete
5823e721608f: Pull complete
a564ada930a9: Pull complete
539565d00e89: Pull complete
a11a06843fd5: Pull complete
92f6d4aa041d: Pull complete
Digest: sha256:a43f6e7e7f3a5e5b90f857fbed4e3103ece771b19f0f75880f767cf66bbb6577 #签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest #真实地址
#指定版本下载
docker pull mysql:5.7
docker rmi 删除镜像
[root@localhost zly]# docker rmi -f feb5d9fea6a5
Untagged: hello-world:latest
Untagged: hello-world@sha256:4e83453afed1b4fa1a3500525091dbfca6ce1e66903fd4c01ff015dbcb1ba33e
Deleted: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412
容器命令
docker pull cenos
新建容器并启动
docker run [可选参数] image
#参数说明
--name="Name" 容器名字
-d 后台方式运行
-it 使用交互式运行,进入容器查看内容
-P 指定容器的端口
主机端口:容器端口
容器端口
-p 随机指定端口
#测试,启动并进入容器
[root@localhost zly]# docker run -it centos /bin/bash
[root@a40520db6ebe /]#
#从容器中退回主机
[root@a40520db6ebe /]# exit
exit
列出所有运行中的容器
[root@localhost zly]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost zly]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a40520db6ebe centos "/bin/bash" 3 minutes ago Exited (0) About a minute ago wonderful_napier
731608cda88e feb5d9fea6a5 "/hello" 7 days ago Exited (0) 7 days ago suspicious_yalow
退出容器
exit #容器退出
Ctrl+P+Q #不停止退出
删除容器
docker rm #容器id
docker rm -f $(docker ps -aq) #删除所有容器
启动和停止容器的操作
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
常用其他命令
后台启动容器
#命令 docker run -d centos
#问题docker ps,发现centos停止了
#常见的坑,docker容器使用后台运行,就必须要有一个前台进程,docker发现没用应用,就会自动停止
查看日志
docker logs
#显示日志
docker -tf #显示日志
--tail number #要显示日志条数
查看镜像元数据
docker inspect 容器id
[root@localhost zly]# docker inspect b40a76a04b79
[
{
"Id": "b40a76a04b79930aafa94f930f62c36610a447a4fb925899d3e3d679af2cd2ff",
"Created": "2023-05-04T06:43:44.085354509Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 14323,
"ExitCode": 0,
"Error": "",
"StartedAt": "2023-05-04T06:43:44.540079324Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
"ResolvConfPath": "/var/lib/docker/containers/b40a76a04b79930aafa94f930f62c36610a447a4fb925899d3e3d679af2cd2ff/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/b40a76a04b79930aafa94f930f62c36610a447a4fb925899d3e3d679af2cd2ff/hostname",
"HostsPath": "/var/lib/docker/containers/b40a76a04b79930aafa94f930f62c36610a447a4fb925899d3e3d679af2cd2ff/hosts",
"LogPath": "/var/lib/docker/containers/b40a76a04b79930aafa94f930f62c36610a447a4fb925899d3e3d679af2cd2ff/b40a76a04b79930aafa94f930f62c36610a447a4fb925899d3e3d679af2cd2ff-json.log",
"Name": "/dazzling_jennings",
"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,
"CgroupnsMode": "host",
"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/40b1197af4899442278ca13ab240b3ae2bd61d18cb51969e808ee21f7b8aab18-init/diff:/var/lib/docker/overlay2/93b5bf7991d694d895dbf4ce5c48948a4da33dd596b002564ef9fc93fa79b695/diff",
"MergedDir": "/var/lib/docker/overlay2/40b1197af4899442278ca13ab240b3ae2bd61d18cb51969e808ee21f7b8aab18/merged",
"UpperDir": "/var/lib/docker/overlay2/40b1197af4899442278ca13ab240b3ae2bd61d18cb51969e808ee21f7b8aab18/diff",
"WorkDir": "/var/lib/docker/overlay2/40b1197af4899442278ca13ab240b3ae2bd61d18cb51969e808ee21f7b8aab18/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "b40a76a04b79",
"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": "20210915",
"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": "8eb17d7c4913be7192145952378fae1e266b02fa16b8b8fe8eff1a3ca6e2cb6a",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/8eb17d7c4913",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "5fd7933eb5439a0125b3e171952321729c0f2e451758735e391a008bf2259c3d",
"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": "3eb7519a7549af1c22ab028ba7c22afe95e956aa242f3a4e95f3671bf29d981d",
"EndpointID": "5fd7933eb5439a0125b3e171952321729c0f2e451758735e391a008bf2259c3d",
"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
#方式二 进入容器正在执行的终端,不会启动新的进程
docker attach 容器id
从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 主机路径
Docker安装nginx
#1、搜索镜像
#2、下载镜像 pull
#3、启动容器 docker run -d --name nginx01 -p 3344:80 nginx
#4、进入容器 docker exec -it nginx01
可视化
- portainer(docker图形化管理工具!提供一个后台面板供我们操作)
docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-29TmEy4m-1684741770024)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20230505093452155.png)]
Docker镜像详解
镜像是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
所有的应用,直接打包docker镜像,就可以直接跑起来 !
Docker镜像加载原理
UnionFS ( 联合文件系统 )
我们下载的时候看到的一层层就是这个 !
UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtualfilesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像 ),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统警加起来,这样最终的文件系统会包含所有底层的文件和目录。
Docker镜像加载原理
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs (root file svstem),在bootfs之上。包含的就是典型 Linux 系统中的 /dev,/proc,/bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
commit镜像
docker commit 提交容器成为一个新的副本
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名“
[root@localhost zly]# docker commit -a="zhangly" -m="add webapps app" 0495b3a442ec tomcat_zly
容器数据卷
什么是容器数据卷
容器之间可以有一个数据共享的技术!Docker 容器中产生的数据,同步到本地!
容器的持久化和同步操作
使用数据卷
直接使用命令来挂载 -v
docker run -it -v 主机目录:容器目录
实战:安装MySql
#获取镜像
[root@localhost zly]# docker pull mysql
#运行容器。需要做数据挂
[root@localhost zly]# docker run -d -p 3310:3306 -v doc -e MYSQL_ROOT_PASSWORD=123456 --name mysql_zly mysql
具名和匿名挂载
# 匿名挂载,没有写容器外的路径
-v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx
#查看所有volume
docker volume -ls
#具名挂载
-v 卷名:容器内路径
所有的卷都在/var/lib/docker/volumes
初识Dockerfile
Dockerfile就是用来构建docker镜像的构造文件
通过脚本生成镜像,镜像是一层一层的,脚本是一个一个一个命令
#创建一个dockerfile文件,名字可以随机 建议 Dockerfile
# 文件中的内容 指令(大写)参数
FROM centos
VOLUME["voTume0","voTume02"]
CMD echo "----end-----"
CMD /bin/bash
# 这里的每个命令,就是镜像的一层!
构造的时候进行挂载
数据卷容器
多个容器同步数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZAPwfpum-1684741770026)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20230508141441076.png)]
父容器docker01
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cf8fNFH4-1684741770027)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20230508141806288.png)]
子容器通过
docker run -it --name docker02 --volumes-from docker01 centos
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x8NSY4gU-1684741770027)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20230508142915668.png)]
注:停用或删除父容器,共享数据仍然存在,一旦你持久化本地就不会消失。
DockerFile
DockerFile构建过程
基础知识:
1、每个保留关键字都必须是大写字母
2、执行从上到下顺序执行
3、#表示注释
4、每一个指令都会创建提交一个新的镜像层,并提交 !
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3SMmwdxz-1684741770028)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20230508152527716.png)]
dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!
DockerFile:构建文件,定义了一切步骤,源代码
Dockerlmages:通过 DockerFile 构建生成的镜像,最终发布和运行的产品!
Docker容器:容器就是镜像运行起来提供服务器
DockerFile的指令
FROM # 基础镜镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的,姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤:tomcat镜像,这个tomcat压缩包! 添加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOST # 保留端口配置
CMD # 指定这个容器启动的时候要运行的命令
ENV # 构建的时候设置环境变量
实战测试构建自己的镜像
#编写Dockerfile配置文件
FROM centos
MAINTAINER zhangly<1239326083@qq.com>
ENV MYPATH /usr/local
WORKIDR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "----end----"
CMD /bin/bash
#通过这个文件构建镜像
[root@localhost dockerfile]# docker build -f mydockerfile -t mycentos:0.1 .
CMD和ENTRYPOINT的区别
#CMD 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
#ENTRYPOINT 指定这个容器启动的时候要运行的命令,可以追加命令
Dockerfile制作tomcat镜像
1、准备镜像文件tomcat压缩包,jdk的压缩包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZftxzMfY-1684741770028)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20230510111100809.png)]
2、编写Dockerfile文件,官方命名"Dockerfile"
FROM centos:7
MAINTAINER zhangly<1239326083@qq.com>
COPY readme.txt usr/local/readme.txt
ADD jdk-8u11-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.22.tar.gz /usr/local
RUN yum -y install vim
ENV MYPATH /usr/local
WORK $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.22
ENV PATH $PATH:$PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.22/bin/logs/catalina.out
3、构建镜像
# docker build -t diytomcat .
4、启动镜像
5、访问测试
6、发布项目
发布自己的镜像
DockerHub
1、地址https://hub.docker.com 注册自己的账号
2、确定这个账号可以登录。
3、在我们服务器提交自己的镜像
#docker login -u zhangly503 登录
#docker push zhanglanyi/diytomcat
阿里云容器服务
1、登录阿里云
2、找到容器镜像服务
3、创建命名空间
4、创建容器镜像
5、按照阿里云的提示
SpringBoot微服务打包docker镜像
1、将项目打包成jar包
2、Idea装一个插件 搜索docker
r:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.22
ENV PATH
P
A
T
H
:
PATH:
PATH:PATH:
J
A
V
A
H
O
M
E
/
b
i
n
:
JAVA_HOME/bin:
JAVAHOME/bin:CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.22/bin/logs/catalina.out
3、构建镜像
```shell
# docker build -t diytomcat .
4、启动镜像
5、访问测试
6、发布项目
发布自己的镜像
DockerHub
1、地址https://hub.docker.com 注册自己的账号
2、确定这个账号可以登录。
3、在我们服务器提交自己的镜像
#docker login -u zhangly503 登录
#docker push zhanglanyi/diytomcat
阿里云容器服务
1、登录阿里云
2、找到容器镜像服务
3、创建命名空间
4、创建容器镜像
5、按照阿里云的提示
SpringBoot微服务打包docker镜像
1、将项目打包成jar包
2、Idea装一个插件 搜索docker