一、Docker安装
1、卸载
1.卸载老版本docker:
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-enginee
2、安装依赖工具
2.安装docker的依赖工具
yum install -y yum-utils
3、设置镜像的仓库
3.设置镜像的仓库
官方:
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo # 默认国外的
推荐使用阿里云,加载速度快:
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #
3.1.更新yum软件包索引
yum makecache fast # 缓存清空
4、安装docker
4.安装docker相关的(默认最新版本) docker-ce社区版
yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
2)安装指定版本
yum list docker-ce --showduplicates | sort -r # 查看可进行安装的docker版本
yum install docker-ce-20.10.17 docker-ce-cli-20.10.17 containerd.io docker-compose-plugin
格式:sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io docker-compose-plugin
5、启动docker服务
5.启动docker
systemctl start docker
6、添加阿里云加速地址
阿里云网站:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
加速配置:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://cotgs0z6.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload # 加载修改的配置
sudo systemctl restart docker # 重启服务
7、查看docker版本信息
7.使用docker version 查看是否安装成功
[root@szb ~]# docker version
Client: Docker Engine - Community
Version: 20.10.17
API version: 1.41
Go version: go1.17.11
Git commit: 100c701
Built: Mon Jun 6 23:05:12 2022
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.17
API version: 1.41 (minimum version 1.12)
Go version: go1.17.11
Git commit: a89b842
Built: Mon Jun 6 23:03:33 2022
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.6
GitCommit: 10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1
runc:
Version: 1.1.2
GitCommit: v1.1.2-0-ga916309
docker-init:
Version: 0.19.0
GitCommit: de40ad0
8、测试拉取一个镜像
8.测试hello-world
docker run hello-world
查看下载的镜像
[root@szb ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 8 months ago 13.3kB
9、卸载docker
9.卸载docker
卸载依赖,删除资源目录
yum remove docker-ce docker-ce-cli containerd.io docker-compose-plugin
rm -rf /var/lib/docker # docker的默认工作路径
rm -rf /var/lib/containerd
10、帮助文档
11、官方镜像源
12、安装docker-compose
以下是常规安装方式,但是本人上述安装中,已经安装了docker-compose-plugin,命令也和之前的有区别:docker compose version,怀疑是现在已经不需要额外安装了,默认和docker一起安装上了,待考证!!!
1.直接命令安装
curl -L "https://github.com/docker/compose/releases/download/2.6.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
2.或者直接在浏览器上打开https://github.com/docker/compose/releases 找到对应的版本,下载放到/usr/local/bin/目录下面
3.赋予权限:
chmod +x /usr/local/bin/docker-compose
4.报错:如果出现docker-compose不存在,则执行以下命令:
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
5.注意:新版本docker可以直接yum安装
官方帮助文档
Install Docker Compose
Compose V2 帮忙文档:
Compose V2 | Docker Documentation
二、帮助命令
1.docker version # 显示docker的版本信息
2.docker info # 显示详细的系统详细,包括镜像和容器的数量
3.docker 命令 --help # 万能命令,显示该命令的详细信息,以及使用方法
三、docker相关命令
1、镜像
1.拉取镜像
docker pull 镜像名 # 默认下载最新版本的镜像
docker pull 镜像名:版本号 # 下载指定版本
2.查看镜像
docker images # 查看本地主机上的镜像
-a #列出所有镜像
-q #只显示镜像的id
3.搜素镜像
docker search 镜像名
--f # 过滤选项
eg:docker search --filter=SIZE=5000 mysql
4.删除镜像
docker rmi 镜像id #删除镜像,必须停止并且删除容器后,才可以删除镜像
docker rmi 镜像id 镜像id #删除多个镜像
docker rmi $(docker image -aq) #删除所有本地的镜像
-f # 强制删除
5.查看镜像构建历史
docker history 镜像id
6.导入导出镜像
docker save -o /opt/imagesname.tar # 导出镜像
docker load -i /opt/imagesname.tar # 导入镜像
2、容器
有镜像才能创建容器
1.新建容器并启动
docker run [选项] 镜像名
--name='centos01' #容器的名称,用于区分同一镜像创建的不同容器
-d # 后台运行
-it # 交互式运行,并进入容器查看内容
-P # 大P为随机映射端口
-e # 环境配置
--volumes-from # 数据卷容器之间的同步
–dns=1.1.1.1 # 默认采用宿主机dns主机,自定义参数配置
# 指定映射端口的三种方式:
-p 容器端口
-p ip:主机端口:容器端口
-p 主机端口:容器端口
示例:dcoker run -it --name centos01 -p 80:80 centos
2.docker ps # 列出正在运行的容器
-a # 列出正在运行的容器+历史上运行的容器
-q # 列出正在运行的容器ID
-n=? # 显示最近创建的容器
3.容器启动、停止操作--start/restart/stop/kill
docker start 容器id # 启动容器
docker restart 容器id # 重启容器
docker stop 容器id # 停止容器
docker kill 容器id # 强制停止容器
4。进入容器
docker exec -it CONTAINER ID(容器的编号) /bin/bash # 进入容器后,会开启新的终端,在里面操作(常用)
docker attach 容器id # 进入容器后,不会开启新的终端,直接使用正在运行的终端
docker inspect -f "{{.State.Pid}}" a5d89c9bc46d # 获取容器pid
nsenter -t 15647 -m -u -i -n -p # 通过pid进入容器
5.退出容器
exit # 退出并停止容器
Ctrl+q+p #退出不停止容器
6.删除容器
docker rm 容器id # 删除指定容器,不可以删除正在运行中的容器
docker rm $(docker ps -aq) # 删除所有容器
-f # 可以删除正在运行中的容器
docker ps -a -q | xargs docker rm # 删除所有容器
7.拷贝(容器和宿主机互相拷贝文件)
主机文件 --> 容器
docker cp 要拷贝的文件路径 容器名:要拷贝到容器里面对应的路径
eg:docker cp /data/test.txt centos:/home
容器文件 --> 主机路径
docker cp 容器名:要拷贝的文件在容器里面的路径 目标主机路径
eg:docker cp centos:/home/test.txt /data
8.查看日志
docker logs 容器id
docker logs --tf --tail 日志显示条数 容器id
-t # 显示时间戳
-f # 关注日志输出,不主动退出屏幕输出,默认结束打印,持续查看
9.查看容器中的进程数
docker top 容器id
10.查看镜像的元数据
docker inspect 容器id
-f # 获取信息的具体字符串
docker inspect -f "{{.NetworkSettings.IPAddress}}" a5d89c9bc46d # 获取容器ip地址
11.查看容器卷id
docker volume ls
12.查看容器已经映射的端口
docker port 容器id
结构示意图
images:
1.commit/create (images -- container)
2.import (tar file --> images)
3.load/save (images -- tar file)
4.build (Dockerfile --> images)
5.pull/push (images -- registry)
6.diff (images -- container)
7.cp (container--> host)
8.export (container--> tar file)
container:
1.stop
2.start
3.stop/kill
4.pause/unpause
5.run
6.wait
7.logs
8.attach/exec
9.^P ^q
10.inspect
11.port
12.top
13.ps
14.rm
registry:
1.pull
2.push
3.search
4.login
5.logout
Engine:
1.info
2.version
3.events
四、实战测试
1、部署nginx
0. docker search nginx # 查询docker仓库的nginx服务镜像版本
1. docker pull nginx # 拉取nginx默认最新版镜像
2. docker images # 查看本地是否拉取
3. docker run -d --name nginx01 -p 80:80 nginx # 启动镜像(重命名,端口映射)
4. docker ps # 查看正在运行的容器
5. curl localhost # 验证nginx容器服务是否正常运行
2、部署Tomcat
docker run -it --rm # 一般用于测试,用完就删
1. docker pull tomcat # 下载tomcat
2. docker run -d -p 8080:8080 --name tomcat01 tomcat
3. curl localhost:8080 # 验证tomcat容器服务是否正常运行
报错:HTTP状态 404 - 未找到
4. docker exec -it tomcat01 /bin/bash # 进入容器修改配置
5. root@74b4f75ef056:/usr/local/tomcat# cp -r webapps.dist/* webapps/ # 刷新页面即可
3、部署portainer
环境少的适用,基于web的docker开源管理程序
Portainer Server 将通过端口 9000(官网最新是9443) 公开 UI,并通过端口 8000 公开 TCP 隧道服务器
官方地址:Docker Standalone Linux (portainer.io)
Docker图形化界面管理工具
1. 启动并运行portainer容器
docker run -d -p 8000:8000 -p 9000:9000 --name=portainer01 --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v /data/portainer_data:/data portainer/portainer:latest
2. 访问测试:
http://localhost:9000
3. 报错:
[root@szb portainer_data]# curl localhost:9443
Client sent an HTTP request to an HTTPS server.
解决:把请求路径改为https://ip:端口去访问
4. 添加远端到portainer
添加dockerd监听2375端口
1)dockerd --help
-H, --host list Daemon socket(s) to connect to
2)[root@szx ~]# vim /lib/systemd/system/docker.service
dockerd -H fd:// -H tcp://0.0.0.0:2375
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2345 --containerd=/run/containerd/containerd.sock
3)加载并重启docker
systemctl daemon-reload
systemctl restart docker
4)查看哪个服务监听2375
lsof -i 2375
4、部署Mysql
1. docker pull mysql:5.7
2. docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
3. 配置参数解析
/etc/mysql/conf.d # 自定义配置文件
/var/lib/mysql # 数据库存储目录
五、docker命令实战
1. commit
docker commit -m "添加镜像描述信息" -a="作者" 容器id 目标镜像名:[tag]
例如:将刚修改配置的tomcat打包成一个镜像文件,下次直接启用即可
[root@szb ~]# docker commit -m "添加nginx镜像" -a "szb" 88abb969d237 nginx_webapp:v1
2. 容器卷挂载:-v
docker run -it -v 主机目录:容器目录 容器ID # 具名挂载
docker inspect 容器id # 查看挂载的目录
匿名挂载:-v 卷名:容器内路径
1)具名挂载:-v 参数 卷名:容器内路径
2)匿名挂载:-v 参数后面 没有写上容器之外的地址, docker 自己会在docker内部给你找个位置
3)指定路径挂载: -v /宿主机路径::容器内路径
3、挂载的延伸--具名/匿名挂载
1.用法:docker volume inspect 卷名
或者:
[root@szb ~]# docker volume ls # 查看当前容器挂载的ID
DRIVER VOLUME NAME
local 5571d0f4694d54affe3115bed384d03734e560060e0110c6613f6dbcbb7ba01a
[root@szb ~]# docker inspect 5571d0f4694d54affe3115bed384d03734e560060e0110c6613f6dbcbb7ba01a
[
{
"CreatedAt": "2022-07-01T18:17:54+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/5571d0f4694d54affe3115bed384d03734e560060e0110c6613f6dbcbb7ba01a/_data",
"Name": "5571d0f4694d54affe3115bed384d03734e560060e0110c6613f6dbcbb7ba01a",
"Options": null,
"Scope": "local"
}
]
[root@szb ~]# cd /var/lib/docker/volumes # 容器卷地址
2.具名挂载:
[root@szb local]# docker run -it -d -p 80:80 -v szb:/etc/nginx 66e634b3c555 /bin/bash
[root@szb local]# docker volume ls
DRIVER VOLUME NAME
local 5571d0f4694d54affe3115bed384d03734e560060e0110c6613f6dbcbb7ba01a
local szb # 上面设置的卷名
[root@szb local]# docker inspect szb
"Mountpoint": "/var/lib/docker/volumes/szb/_data",
3.权限
rw :可读可写的权限
ro : 可读权限
[root@localhost ~]# docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:ro nginx
六 Dockerfile
1、dockerfile基础
1. 作用:构建docker镜像的构建文件;
2. 文件参数:(指令大写)
3. Usage(末尾必须有点):docker build .
-f /path/to/a/Dockerfile # 指定dockerfile文件路径
-t shykes/myapp:1.0 # 指定存储库和标记
4. 注意:
1)不要将根目录 () 用作构建上下文,因为这会导致构建将硬盘驱动器的全部内容传输到 Docker 守护程序
2)名字首字母默认大写;
3)按顺序运行指令,必须以 FROM 指令开头
5. Docker会使用构建缓存来加速构建过程
文件指令参数
1. FROM # 指定父镜像,基础镜像,一切从这里开始
2. LABEL 指令是用来生成镜像的元数据标,打标签,key=value
LABEL maintainer="shadabin"
3. MAINTAINER # 设置作者 邮箱 szb<sdb@qq.com>
4. ADD # 添加步骤,添加压缩包等操作,会自动解压
5. COPY # 拷贝文件到镜像中,类似ADD,需要手动解压;.war是zip格式,java代码
6. ENV # 构建的时候设置容器环境变量
7. EXPOSE # 定义容器暴露端口配置
8. LABEL # 将元数据添加到镜像
9. RUN # 镜像构建的时候,容器需要运行的shell命令
10. STOPSIGNAL # 设置将发送到容器以退出的系统调用信号,指定容器退出的信号值,升级时可能才用
11. USER # 指定容器执行操作的用户
12. VOLUME # 挂载的目录;创建一个挂载点,用于挂载外部存储,从而将容器的数据保存到外部存储,避免数据丢失,可以一次创建多个
13. WORKDIR # 指定镜像的工作目录
14. ONBUILD (与上述指令之一结合使用) # 当构建一个被继承 Dockerfile 这个时候就会运行ONBUILD 的指令
13.ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令;+CMD的参数
15. CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
2、实战范例
Dockerfile 实战–nginx-tomcat-happroxy
1)centos
GitHub示例:
scratch # 从零开始
------------------------------------------------------------------------
FROM scratch
ADD centos-7-x86_64-docker.tar.xz /
LABEL \
org.label-schema.schema-version="1.0" \
org.label-schema.name="CentOS Base Image" \
org.label-schema.vendor="CentOS" \
org.label-schema.license="GPLv2" \
org.label-schema.build-date="20201113" \
org.opencontainers.image.title="CentOS Base Image" \
org.opencontainers.image.vendor="CentOS" \
org.opencontainers.image.licenses="GPL-2.0-only" \
org.opencontainers.image.created="2020-11-13 00:00:00+00:00"
CMD ["/bin/bash"]
自己测试:
FROM centos:latest
LABEL name=centos.v1
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN cd /etc/yum.repos.d/
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
RUN yum -y install net-tools
RUN yum -y install vim
EXPOSE 80
CMD /bin/bash
七、Docker仓库
1、需要创建仓库账号
2、登录
1、docker官网
1.登录
[root@szb ~]# docker login docker.io
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: shadabin
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
2.查看登录成功后隐藏文件(用于保存登录认证信息)
[root@szb ~]# cat /root/.docker/config.json
{
"auths": {
"https://index.docker.io/v1/": {
"auth": "c2hhZGFiaW46c3piNTMyNzU0OSw="
}
}
3. 打tag
[root@szb ~]# docker tag nginx_compile:v1 docker.io/shadabin/nginx_compile:v1
4.上传到docker镜像
[root@szb ~]# docker push docker.io/shadabin/nginx_compile:v1
5. 更换到其它docker服务下载镜像
docker login https://hub.docker.com
docker官网验证:
2、aliyun官网
1.登录阿里云Docker Registry
docker login --username=xxxx registry.cn-hangzhou.aliyuncs.com
2.从Registry中拉取镜像
docker pull registry.cn-hangzhou.aliyuncs.com/shadabin/docker:[镜像版本号]
3.将镜像推送到Registry(先第一步登录才可以)
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/shadabin/docker:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/shadabin/docker:[镜像版本号]
八、Docker网络
查看所有的docker网络:
[root@szb ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
b1b7d5e9f103 bridge bridge local
a012ac26e047 host host local
3c55c058c5b9 none null local
网络模式:
bridge:桥接docker(自定义也使用桥接模式)
none:不配置网络
host:和宿主机共享网络
container:容器网络连通(用的少,局限很大)
九、docker资源限制
十、Docker Compose
十一、报错
dockerfile启动tomcat,浏览器访问不了问题–总结