Docker安装
1、查看系统内核和系统信息
命令:
uname -r #查看系统内核版本
cat /etc/os-release #查看系统版本
2、开始安装Docker
2.1 卸载旧版本
命令:
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2.2 下载依赖安装包
yum install -y yum-utils
2.3 配置镜像仓库
#国外的地址
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
#设置阿里云的Docker镜像仓库
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2.4 更新yum软件包
yum makecache fast
2.5 下载docker
#一般情况下安装社区版
yum install docker-ce docker-ce-cli containerd.io # 安装社区版
yum install docker-ee docker-ee-cli containerd.io # 安装企业版
3、启动Docker
命令:
systemctl start docker # 启动Docker
docker version # 查看当前版本号,是否启动成功
systemctl enable docker # 设置开机自启动
4、Docker测试
拉取Docker的HelloWorld镜像
命令:
docker run hello-world
示例:
[root@iZ1608aqb7ntn9Z /]# docker run hello-world
Unable to find image 'hello-world:latest' locally # 本地没有
latest: Pulling from library/hello-world # pull一个最新版
b8dfde127a29: Pull complete # pull成功
Digest: sha256:df5f5184104426b65967e016ff2ac0bfcd44ad7899ca3bbcf8e44e4461491a9e
Status: Downloaded newer image for hello-world:latest
Hello from Docker! # 运行结果
This message shows that your installation appears to be working correctly.
5、Docker卸载
yum remove docker-ce docker-ce-cli containerd.io # 卸载依赖
rm -rf /var/lib/docker # 删除资源 . /var/lib/docker是docker的默认工作路径
6、配置阿里云镜像
6.1 阿里云官网容器镜像服务
6.2 执行命令
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://axvfsf7e.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker运行流程和原理
1、启动流程
2、运行原理
3、Docker整体架构
Docker常用命令
1、基本命令
查看版本信息
docker version
查看系统信息
docker info
帮助命令
docker 命令 --help
docker COMMAND --help
2、镜像命令
查看镜像
docker images
搜索镜像
docker search
下载镜像
docker pull 镜像名[:tag]
删除镜像
docker rmi
3、容器命令
运行容器
docker run [可选参数] image
进入容器
docker run -it [容器ID] /bin/bash*
#参数说明
--name="名字" 指定容器名字
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口
( -p ip:主机端口:容器端口 配置主机端口映射到容器端口
-p 主机端口:容器端口
-p 容器端口)
-P 随机指定端口(大写的P)
退出容器
停止并退出容器(后台方式运行则仅退出) exit
不停止容器退出 Ctrl+P+Q
列出容器
docker ps
删除容器
docker rm 容器id #删除指定的容器,不能删除正在运行的容器,强制删除使用 rm -f
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器
启动和重启容器命令
docker start 容器id *#启动容器*
docker restart 容器id *#重启容器*
docker stop 容器id *#停止当前运行的容器*
docker kill 容器id *#强制停止当前容器
查看容器中进程
*docker top 容器id*
查看容器元数据
*docker inspect 容器id*
进入运行中的容器
1、docker exec -it 容器id /bin/bash
------进入容器后开启一个新的终端,可以在里面操作(常用)
2、docker attach 容器id
------进入容器正在执行的终端,不会启动新的进程
从容器拷贝文件到主机上
docker cp 容器id:容器内路径 目的主机路径
4、其他命令
查看日志
docker logs --help
Logs选项 --details Show extra details provided to logs
-f, --follow Follow log output
--since string Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)
-n, --tail string Number of lines to show from the end of the logs (default "all")
-t, --timestamps Show timestamps
--until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)
常用:
docker logs -tf 容器id
docker logs -tf --tail number 容器id #num为要显示的日志条数
启动Es并增加内存
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
参数说明:
-d 后台运行
-p 镜像内端口映射主机
-e(环境配置) 对应es集群
-e(环境配置) 增加容器内内存
5、小结
attach Attach to a running container #当前shell下attach连接指定运行镜像
build Build an image from a Dockerfile #通过Dockerfile定制镜像
commit Create a new image from a container changes #提交当前容器为新的镜像
cp Copy files/folders from the containers filesystem to the host path#从容器中拷贝指定文件或者目录到宿主机中
create create a new container #创建一个新的容器,同run,但不启动容器
diff Inspect changes on a container's filesystem #查看docker容器变化
events Get real time events from the server #从docker服务获取容器实时事件
exec Run a command in an existing container #在已存在的容器上运行命令
export Stream the contents of a container as a tar archive #导出容器的内容流作为一个tar归档文件[对应import]
history show the history of an image #展示一个镜像形成历史
images List images #列出系统当前镜像
import Create a new filesystem image from the contents of a tarball #从tar包中的内容创建一个新的文件系统映像[对应export]
info Display system-wide information #显示系统相关信息
inspect Return low-level information on a container #查看容器详细信息
kill Kill a running container #kill指定docker容器
load Load an image from a tar archive #从一个 tar包中加载一个镜像[对应save]
login Register or Login to the docker registry server #注册或者登陆一个docker 源服务器
logout Log out from a Docker registry server #从当前Docker registry退出
logs Fetch the logs of a container #输出当前容器日志信息
port Lookup the public-facing port which is NAT-ed to PRIVATE_PORT #查看映射端口对应的容器内部源端
pause Pause a11 processes within a container #暂停容器
ps List containers #列出容器列表
pull Pull an image or a repository from the docker registry server #从docker镜像源服务器拉取指定镜像或者库镜像
push Push an image or a repository to the docker registry server #推送指定镜像或者库镜像至docker源服务器
restart Restart a running container #重启运行的容器
rm Remove one or mdre containers #移除一个或者多个容器
rmi Remove one or more i mages #移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或-f强制删除]
run Run a command in a new container #创建一个新的容器并运行一个命令
save Save an image to a tar archive #保存一个镜像为一个tar包[对应1oad]
search Search for an image on the Docker Hub #在docker hub 中搜索镜像
stats #查看镜像内存
start Start a stopped containers #启动容器
stop Stop a running containers #停止容器
tag Tag an image into a repos itory #给源中镜像打标签
top Lookup the running processes of a container #查看容器中运行的进程信息
unpause Unpause a paused container #取消暂停容器
version Show the docker version informati on #查看docker版本号
wait Block until a container stops, then print its exit code #截取容器停止时的退出状态值
Docker可视化
1、portainer(目前使用)
docker run -d -p 8088:9000 \ --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true protainer/portainer
2、Rancher(常用)
(CI/CD持续集成/持续部署使用)
容器数据卷
1、什么是容器数据卷
目的:讲容器内的数据挂载到主机上。容器的持久化和同步操作,容器间数据也可以共享。
2、指定路径挂载
docker run -it -v 主机目录:镜像内目录
# -v 主机目录:镜像内目录
3、具名挂载
#写了卷名:容器内路径,与匿名挂载区别为定义了卷名.
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx #-v 卷名:容器内路径
#查看定义卷名的
1、docker volum ls
2、docker volume inspect juming-nginx
4、匿名挂载(不建议)
#只写容器内路径,不写容器外路径,即匿名挂载
docker run -d -P --name nginx01 -v /etc/nginx nginx #-v 只写容器内路径
docker volume ls # 查看所有的挂载卷
5、卷默认位置
所有的docker容器内的卷,没有指定目录的情况下都是在'/var/lib/docker/volumes/xxxxxx/_data'
6、挂载设置权限
#通过 -v 主机路径:容器内路径:ro/rw 改变读写权限
ro readonly #只读
rw readwrite #可读可写(默认)
#设置了容器权限,容器对挂载出来的内容就有限定了.
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
#ro只要看到ro就说明这个路径只有主机能够操作,容器内部无法操作
7、数据卷容器(容器间数据同步)**
镜像内数据同步操作
#创建一个父镜像 docker01
docker run -it --name docker01 zhouz/centos:1.0 /bin/bash
ctrl+p+q #退出镜像并在后台执行
#创建另外镜像02指向docker01
docker run -it --name docker02 --volumes-from docker01 zhouz/centos:1.0 /bin/bashduoe
多个mysql容器之间实现数据共享
docker run -d -p 8080:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=zhou123 --name mysql01 mysql
docker run -d -p 8080:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=zhou123 --name mysql02 --volums-form mysql01 mysql
结论:容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止.
创建镜像
1、commit命令创建
docker commit 提交容器成为一个新的副本
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
2、Dockerfile构建
构建步骤:
- 1、编写一个Dockerfile文件
- 2、docker build 构建成为一个镜像
- 3、docker run 运行镜像
- 4、docker push 发布镜像(DockerHub、阿里云镜像仓库)
Dockerfile就是用来构建docker镜像的构建文件.
通过此脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层.
1、每个保留关键字(指令)都必须是大写字母
2、执行从上到下顺序执行
3、#表示注释
4、每一个指令都会创建 提交一个新的镜像层,并提交.
#创建Dockerfile文件,名字随意,建议用 Dockerfile
vim Dockerfile
#写入内容 文件内指令(必须大写!!!)
FROM centos:7 #以centos7为基础构建镜像文件
VOLUME ["volume01","volume02"] #创建两块卷
CMD echo "------end-----"
CMD /bin/bash
#通过docker build命令构建镜像
docker build -f dockerfile -t zhouz/centos:1.0 .
# -f Dockerfile脚本文件位置
# -t docker镜像名称:后跟版本号
# . 默认上下文路径
3、DockerFile的指令
FROM #基础镜像,一切从这里构建
MAINTAINER #镜像是谁写的,姓名+邮箱 格式:MAINTAINER zhouz<123@qq.com>
RUN #镜像构建的时候需要运行的命令
ADD #添加内容到镜像内 格式:ADD 文件名 镜像内路径 ,,添加压缩包自动解压
WORKDIR #镜像的工作目录
VOLUM #挂载的目录
EXPOSE #保留端口配置 = -p
CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTYRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD #当构建一个被继承的DockerFile 这个时候就会运行ONBUILD 的指令,触发指令.
COPY #类似ADD,将我们的文件拷贝到镜像中
ENV #构建的时候设置环境变量
4、DockerFile构建centos
创建自己的centos
#1、编写DockerFile文件
[root@zhouz dockerfile]# cat dockerfile-centos
FROM centos
MAINTAINER zhouz<123@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash
#2、通过这个文件构建镜像
docker build -f dockerfile路径 -t 镜像名:[tag] .
#3、运行测试
#4、查看镜像历史(构建过程)
docker history 镜像ID
拿到镜像,可以用此命令看一下它是怎么做的。
5、DockerFile构建tomcat
1、准备镜像文件 tomcat压缩包,jdk压缩包。
2、编写dockerfile文件,官方命名Dckerfile,build会自动寻找这个文件,就不需要-f指定了。
#构建Dockerfile文件
[root@zhouz tomcat]# cat Dockerfile
FROM centos:7
#签名
MAINTAINER zhou<123@qq.com>
##拷贝说明文件到镜像内
COPY readme.txt /usr/local/readme.txt
##添加安装包到镜像内,会自动解压、、安装包与Dockerfile文件在同一级目录下。
ADD apache-tomcat-8.5.81-src.tar.gz /usr/local/
ADD jdk-18_linux-x64_bin.tar.gz /usr/local/
###安装vim
RUN install yum vim
ENV MYPATH /usr/local
##启动工作目录
WORKDIR $MYPATH
###配置java和tomcat的环境变量到镜像内
ENV JAVA_HOME /usr/local/jdk-18.0.2
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.81-src
ENV CATALINA_BASH /usr/local/apache-tomcat-8.5.81-src
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:CATALINA_HOME:bin
###默认开放8080端口
EXPOSE 8080
####开机启动tomcat 并可以在后面拼接命令 用&&拼接
CMD /usr/local/apache-tomcat-8.5.81-src/bin/startup.sh && tail -F /url/local/apache-tomcat-8.5.81-src/bin/logs/catalina.out
3、构建Docker镜像。
[root@zhouz tomcat]# docker build -f Dockerfile -t mytomcat .
4、启动镜像
#开启了8080端口映射、挂载了镜像内webapp目录和日志目录
docker run -d --name mytomcat01 -p 8080:8080 -v /home/tomcat/test:/usr/local/apache-tomcat-8.5.81-src/webapps/test -v /home/tomcat/tomcatlogs/:/url/local/apache-tomcat-8.5.81-src/logs 82c560dff0ed
5、这里操作失败,启动shell和dockerfile文件内shell会覆盖冲突
6、发布镜像
发布到Dockerhub
1、注册
https://hub.docker.com/
2、机器内登录dockerhub
[root@zhouz docker]# docker login -u zhouz666
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
net/http: TLS handshake timeout,如果报这个错,就把docker里面的daemon.json文件种添加一个国外镜像
#本机deamon.jsopn镜像配置
[root@zhouz docker]# cat daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com","https://nlayiaq0.mirror.aliyuncs.com"]
}
3、上传自己的镜像到dockerhub上
#需要先修改docker镜像名称,docker tag diytomcat [你的dockerhub用户名]/diytomcat,提交也一样docker push [hub用户名]/diytomcat
#docker push (用户名)/(文件名):(版本号)
[root@zhouz docker]# docker tag feb5d9fea6a5 zhouz666/hello-world
[root@zhouz docker]# docker push zhouz666/hello-world
发布到阿里云镜像服务
登录阿里云平台—>容器镜像服务—>创建个人实例—>创建镜像仓库
1. 登录阿里云Docker Registry
$ docker login --username=XXXXXX
用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
您可以在访问凭证页面修改凭证密码。
2. 从Registry中拉取镜像
$ docker pull registry.cn-hangzhou.aliyuncs.com/XXX_test/XXX_test:[镜像版本号]
3. 将镜像推送到Registry
$ docker login --username=XXX registry.cn-hangzhou.aliyuncs.com
$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/XXX_test/XXX_test:[镜像版本号]
$ docker push registry.cn-hangzhou.aliyuncs.com/XXX_test/XXX_test:[镜像版本号]
请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。
小结
Docker网络
1、理解Docke0
每次启动一个docker容器,docker就会给docker容器分一个ip,只要安装了docker,就会有一个网卡docker0桥接模式,使用的技术是evth-pair技术。。。
#evth-pair就是一对的虚拟设备接口。他们都是成对出现的,一端连着协议,一端彼此相连。
#正因为有这个特性,evth-pair充当一个桥梁,连接各种虚拟网络设备的
#OpenStac、Docker容器之间的连接、OVS的连接,都是使用evth-pair技术
2、–net(指定网卡)
docker run --net 网卡名(指定网卡)
3、–link(不推荐使用)
思考一个场景,镜像项目不重启,镜像内IP换掉了,能不能通过镜像名来ping通镜像?
#启动一个tomcat01镜像
docker run -d -P --name tomcat01 tomcat
#通过--link绑定tomcat01的名字到tomcat02上,使02直接ping01的镜像名也能访问
docker run -d -P --name tomcat02 --link tomcat01 tomcat
#绑定完成通过镜像名也能ping通
docker exec -it tomcat02 ping tomcat01
–link就是在/etc/hosts配置中增加了一个tomcat02的配置
现在用Docker不建议使用 --link了。
自定义网络。不适用Docker0
docker0问题:不支持容器名连接访问。
4、自定义网络
查看所有的网络
[root@zhouz ~]# docker network ls
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wKg2z0v5-1659858135291)(C:\Users\z5714\AppData\Roaming\Typora\typora-user-images\image-20220730194559803.png)]
网络模式
bridge : 桥接docker(默认)
none : 不配置网络
host : 和宿主机共享网络
container : 容器网络连通!(用的少,局限很大)
docker run -d -P --name tomcat01 tomcat
==
docker run -d -P --name tomcat01 --net bridge tomcat
#因为bridge是默认网络模式,所以上面两句命令等同。
#docker0特点:默认,域名不能访问,--link可以打通。但是不推荐使用
#可以自己自定义一个网络来使用
--driver 网卡网络模式
--subnet 设置子网地址
--gateway 定义网关
[root@zhouz ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
#查看创建网卡的详细信息
[root@zhouz ~]# docker network inspect mynet
```shell
#使用创建好的网络来进行创建镜像,,,--net指定网络
docker run -d -P --name tomcat01 --net mynet tomcat
docker run -d -P --name tomcat02 --net mynet tomcat
#指定网络创建的地址即为创建网络设定的子网内地址
#直接使用地址和镜像名即可ping通
```
5、不同网段地址连通
问题:两个不同网络之间不能互通。。
利用docker network connect 命令, 让容器和网卡打通
#测试打通使用默认网络的镜像和使用自建网络的镜像打通
[root@zhouz ~]# docker network connect mynet tomcat0
docker network connect 网络名 容器名
#该操作直接把容器的地址放到网络配置文件内
#一个容器,两个地址
需要镜像跨网络操作,就需要使用docker network connect 打通。。
实战:部署Readis集群
readis还没学,先搁置。。。。。。。