安装Docker

#卸载老的版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
#安装yum工具包
yum install -y yum-utils
#配置仓库源
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 #推荐用国内源,丝滑
#安装容器之前,更新yum软件包索引
yum makecache cache
#安装容器相关的。docker-ce(社区版)docker-ee(企业版)
yum install -y docker-ce docker-ce-cli containerd.io
#使用docker version查看是否安装成功
systemctl restart docker && systemctl enable docker
了解:卸载docker
# 1.卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
# 2.删除资源
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
# /var/lib/docker docker的默认工作路径
国内镜像加速
登录阿里云,找到容器服务,找到镜像加速地址配置使用,insecure-registries登录harbor用的
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://do.nark.eu.org", #这个好用
"https://registry.docker-cn.com",
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://cmruiz54.mirror.aliyuncs.com"
],
"insecure-registries":["106.15.137.239"]
}
EOF
启停docker
systemctl daemon-reload
systemctl restart docker && systemctl enable docker

镜像命令

镜像推拉harbor
docker tag  [605c77e624dd/nginx][镜像id/镜像名]  nginx_v2:1.2[新的镜像名称:版本]	  #为镜像打标签,注意id一样的删除小心
#推送到harbor仓库,去harbor看推送方式,必须镜像先tag一下
docker push [镜像仓库URL]/[命名空间名称]/[仓库名称]:[版本号] #推送镜像到仓库,需要登录仓库
#docker tag SOURCE_IMAGE[:TAG] 192.168.16.165/library/REPOSITORY[:TAG] #先修改tag标签,在推送harbor
docker tag nginx 192.168.16.165/library/nginx:1.0 #仓库/目录/新镜像名:版本
docker push 192.168.16.165/library/nginx:1.0 #tag修改后的标签推送到harbor
#拉harbor仓库镜像
docker pull 192.168.16.165/sss/nginx_v1:1.1 #去harbor查看拉取命令
docker tag 192.168.16.165/sss/nginx_v1:1.1 nginx_v1:1.1 #tag在替换回来
镜像保持导入导出,容器提交镜像
#若是只想备份images,使用save、load即可
docker save 镜像名/镜像ID -o #保持镜像保存在哪个位置与名字
docker save nginx_v1 [-o][>] /root/nginx.tar.gz nginx:1.21【镜像名】 #保存的时候没有名字load载入的时候镜像会是none
docker load -i [保存文件位置] #导入镜像
docker load -i /root/nginx.tar
docker commit [选项] [容器ID/容器名称:版本号] #保存容器为镜像-a指定作者-m简介-p保存镜像时,容器暂停运行
docker commit -m="描述信息" -a="作者名" 4120983f3a86[容器id|容器名] nginx_v2:1.2[新名:版本]
镜像基本命令
docker history [镜像名字:镜像版本号] / [镜像ID]
docker image prune #清理未被使用的镜像/有node镜像处理方便啊
docker history 【镜像名字/镜像ID】 #可以查看该镜像的构建过程、变更历史
docker search nginx --filter=STARS=3000 #搜索出来的镜像就是stars大于3000的
docker search nginx #搜索镜像
docker images
docker images -a #显示所有镜像
docker images -q #仅显示镜像id
docker system df #查看所有镜像容器所占空间
docker inspect [镜像名字/镜像ID] #查看镜像详细信息
docker rmi -f nginx_v2:1.2 #删除镜像名:id的镜像,如果有多个镜像的Id不会收到影响
docker rmi -f 605c77e624dd #删除镜像ID,如果你的镜像ID有多个相同会一起被删除,删除不了的原因你的容器还在运行
docker rmi -f 镜像id 镜像id 镜像id #删除多个镜像(空格分隔)

容器命令

启动创建容器
#docker run和docker create之间有两个区别
1、docker run创建容器并立即启动,而docker create 只是创建
2、docker run创建的容器时up状态,而docker create创建的容器是create
3、docker run与create参数一样的
option 作用
-i 以交互模式运行容器,通常与 -t 同时使用
-t 启动容器后,为容器分配一个命令行,通常与 -i 同时使用
-v 目录映射,容器目录挂载到宿主机目录,格式: <host目录>:<容器目录>
-d 守护进程,后台运行该容器
-p 指定端口映射,格式:主机(宿主)端口:容器端口
-P 随机端口映射,容器内部端口随机映射到主机的端口(49153起始 49153到65535)
-u 以什么用户身份创建容器
–name “nginx-lb” 容器名字
-m,–memory bytes 设置容器使用内存最大值
-h, –hostname string 指定容器的 host name
–dns 8.8.8.8 指定容器 dns 服务器
-e username=“ritchie” 设置环境变量
–restart Docker 重启后,容器是否自动重启
–rm 容器退出时自动删除容器。这在临时容器中非常有用。
–env-file 从文件中读取环境变量
–network #指定容器运行的网络
–privileged 容器内是否使用真正的 root 权限
使用示例
docker run|create [选项] [镜像名称|镜像ID] [容器启动后内部执行的命令]
指定容器名称,起多个容器名字不能重复
docker run -itd --name tomcat_yang tomcat:8
将容器的8080端口映射到主机的随机端口
docker run -itd -P --name tomcat_yang tomcat:8
挂载文件/目录
docker run -itd -p 13000:8080 -v /root/tomcat:/usr/local/tomcat/webapps/ROOT tomcat:8
容器的8080端口映射到主机的 12000端口
docker run -itd -p 13000:8080 --name tomcat tomcat:8
设置环境变量,在容器内部可以通过读取该环境变量来配置应用程序
docker run -d -e mysql_url=192.168.1.8 --name tomca_env tomcat:8
重启策略,容器退出时自动重新启动容器,确保容器的持续可用性
docker run -d -–restart=always --name tomca_env tomcat:8
指定容器使用的自定义 DNS 服务器
docker run --dns 8.8.8.8 tomcat:8
给容器赋予特权,可以访问主机的设备
docker run --privileged tomcat:8
容器退出时自动删除容器。这在临时容器中非常有用
docker run --rm tomcat:8
指定容器使用的网络模式
docker run --network bridge tomcat:8
这个参数允许你从文件中读取环境变量,并将其传递给容器
docker run --env-file=1.txt tomcat:8
设置容器的主机名
docker run --hostname my_container tomcat:8
指定容器运行时的用户名或 UID
docker run --user username tomcat:8
从容器复制文件到宿主机
docker cp [容器ID/容器名]:/usr/local/tomcat /tmp/
从宿主机复制文件到容器
docker cp /tmp/1 7c1ae3f18fcc:/tmp/
查看容器,启停容器,进入容器
docker ps 											#列出当前正在运行的容器
docker ps -a #列出当前正在运行的容器+历史运行过的容器
docker ps -q #只显示容器的编号
docker ps -l #最后一次运行的容器
docker ps -f status=exited #查看停止的容器
docker stop 容器ID/容器名 #停止容器
docker restart 容器ID/容器名 #重启容器
docker start 容器ID/容器名 #启动容器,Exited,create
docker rm $(docker ps -a -f status=exited -q) #删除处于 exited 状态的容器
docker rm $(docker ps -a -f status=created -q) #删除已经被创建但从未启动过的容器

docker stats #所有容器资源状态
docker pause 容器ID/容器名 #让一个运行的容器暂停
docker unpause 容器ID/容器名 #让一个容器从暂停状态恢复运行
docker rename 容器名 新容器名 #更换容器名
docker kill 容器ID/容器名 #kill 容器
docker port [端口] 容器名/容器ID #查看端口的映射情况
docker logs 容器ID/容器名 #查看容器运行日志
docker logs -f 容器ID/容器名 #持续跟踪日志
docker logs -f --tail=20 容器ID/容器名 #查看末尾多少行
docker exec -it 容器名/容器ID bash
docker attach 容器名/容器ID #attach正在运行的,命令行
docker top 容器ID/容器名 #查看docker容器中运行的进程信息
docker inspect 容器名 #该命令能够查看该容器详细信息
docker cp 宿主主机路径 [容器ID:容器内文件路径] #复制文件
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称|容器ID #直接输出 IP 地址
容器备份提交成镜像
若是在启动容器后,容器内容有变化,需要备份,则使用export、import、commit
docker export [容器名或ID] > [文件名称] #export将容器导出到标准输出,可以使用输出重定向或-o选项至文件中
docker import [文件名称] [自定义镜像名称]:[版本号] #import是将export导出的文件导入为镜像可以自定义导入的镜像名称和版本号。
退出容器
exit        										#停止并退出容器(后台方式运行则仅退出)
ctrl+P+Q #容器不停止,退出

docker数据卷

#所有的docker容器内的卷,没有指定目录的情况下都在 /var/lib/docker/volumes/
docker volume ls
docker volume inspect 挂载名[具名/匿名] #查看挂载详细信息
docker volume create 挂载名[具名/匿名] #创建一个自定义容器卷
docker volume rm 挂载名[具名/匿名] #删除自定义数据卷
-v 容器内路径 #匿名挂载
-v 卷别名:容器内路径 #具名挂载
-v /宿主机路径:容器内路径 #指定路径挂载
--------------------------------------------------------------------------------------
指定路径挂载
docker run -itd -p 13000:8080 -v /root/tomcat:/usr/local/tomcat/webapps/ROOT tomcat:8
--------------------------------------------------------------------------------------
具名挂载 #注意wahaha前面没有/, 不表示路径,只是起名
docker run -d -p 12000:8080 --name=tom -v wahaha:/usr/local/tomcat/webapps/ROOT tomcat:8
#/var/lib/docker/volumes/wahaha
---------------------------------------------------------------------------------------
匿名挂载 #我们在 -v 只写了容器内的路径, 没有写容器外的路径
docker run -d -p 12000:8080 --name=tom -v /usr/local/tomcat/webapps/ROOT tomcat:8
#两个容器数据卷挂载
docker run -it --name 容器1 镜像1
docker run -it --name 容器2 --volumes-from 容器1 镜像1

Dockerfile 体系结构(保留字指令)

关键字 说明
FROM 基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模版,第一条必须是from
MAINTAINER 镜像维护者的姓名和邮箱地址
RUN 在镜像内部执行命令,用于安装软件包、设置环境等,第一种 shell格式RUN yum -y install vim第二种 **RUN[“可执行文件”,“参数1”,“参数2”]**,多次run的时候最好用&&
EXPOSE 当前容器对外暴露出的端口
ENV 用来构建镜像的过程中设置环境变量
ADD 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY 类似ADD,拷贝文件和目录到镜像中。 第一种写法COPY src dest 第二种写法COPY [“src”, “dest”]
ENTRYPOINT 指定容器启动时要运行的命令,不会被 Docker run 命令覆盖,K8S参数就是command,ENTRYPOINT和CMD最在最后最后执行,ENTRYPOINT并不会像CMD那样覆盖前面的命令参数而是会追加,如果有一个ENTRYPOINT就正常执行,如果有第二个ENTRYPOINT就追加到第一个的后面,一同执行
CMD 指定容器启动时要运行的命令,可以被 Docker run 命令覆盖,K8S参数就是arg,如果存在多个CMD了话,那么只有最后一个CMD生效
VOLUME 实现文件挂载功能,可以将主机目录挂载到容器中,一般的使用场景为需要持久化存储数据时
USER 指定该镜像以什么样的用户去执行,如果不指定,默认是root
WORKDIR 指定在创建容器后,终端默认进入后的目录
ARG 定义构建时的参数
ONBUILD 在当前镜像被用作其他镜像的基础镜像时执行一些命令,通常用于构建通用的基础镜像
STOPSIGNAL 指定容器停止时发送的信号
HEALTHCHECK 指定容器健康检查命令,判断容器是否存活并运行
SHELL 定义默认的 shell,或者在 RUN 指令中覆盖默认 shell
#docker cmd  entrypoint区别
#cmd
FROM centos:latest
CMD echo "Hello, World!" #运行后将会输出Hello, World!
docker run your_image [命令]echo "Goodbye, World!" #运行后将会输出"Goodbye, World!"CMD会被run覆盖
------------------------------------------------------------------------------------------------------------
#entrypoint
FROM centos:7
ENTRYPOINT echo "hello workld"
docker run your_image [命令]echo "Goodbye, World!" #运行后将会输出""hello workld!"entrypoint不会被run覆盖
#结论
#1 docker run 命令替代了dockerfile的CMD命令
#2 docker run 命令在ENTRYPOINT的命令行格式下,无法替换ENTRYPOINT命令行格式的ENTRYPOINT命令,霸道!!!)
#3 当CMD和ENTRYPOINT命令行格式的命令在一起时,ENTRYPOINT命令无条件替换CMD命令(霸道!!!)
#4 当CMD和ENTRYPOINT键值对格式的命令在一起时,CMD命令是ENTRYPOINT命令的参数
#5多条CMD命令,只执行最后一条
#6多条CMD命令,只执行最后一条
#7如果在键值对格式下,看见“/bin/sh”和“-c”的固定搭配,他的本质就是命令行格式

Dockerfile案例

#制作镜像案例1 centos7 添加环境变量添加vim,ipconfig,配置阿里源
docker file制作镜像,指令用大写,文件结构Dockerfile -f 文件路径 -t 起新镜像名 . 当前目录
vim dockerfile1
-----------------------------------------------------------------------------------------------------
FROM centos:7
MAINTAINER 杨城:41401722@qq.com
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
RUN yum install -y vim
RUN yum install -y net-tools
ENV WORKDIR /usr/local/
WORKDIR $WORKDIR
CMD ifconfig
docker build --network=host -f docker_centos1 -t centos_yang1 .#--network=host构建镜像不会改变bridge容器网络
------------------------------------------------------------------------------------------------------
#制作镜像案例2 dockerfile文件docker_centos1 -t 镜像父名centos_father
ONBUILD
#作为父镜像
FROM centos:7
MAINTAINER 杨城:41401722@qq.com
ONBUILD ENV WORKDIR /usr/local/
ONBUILD WORKDIR $WORKDIR
docker build -f docker_centos1 -t centos_father .
#dockerfile文件docker_centos2
FROM centos_father #前面的父镜像作为基础镜像
CMD ifconfig
-------------------------------------------------------------------------------------------------------
docker build -f docker_centos2 -t centos_child .

dockerfile制作碰到问题

#centos7需要下载镜像源docker run运行的容器可以访问外网,dockerfile制作镜像的时候访问不了,构建镜像不会改变bridge容器网络
docker build --network=host -f docker_centos1 -t centos_yang1 .
---------------------------------------------------------------------------------------------------------
#create failed: runc create failed: unable to start container process: error during container init: invalid environment variable: name cannot be empty: unknown.
#环境变量没有设置好

docker网络

#1.自动分配IP地址:Docker能够为每个容器分配一个独立的IP地址,使得容器之间可以通过IP地址进行通信。
#2.默认网桥:Docker在宿主机上创建一个名为docker0的网桥,它会自动将容器连接到该网桥上,从而使得容器之间可以通过网桥进行通信。
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:34ff:fe82:131b prefixlen 64 scopeid 0x20<link>
ether 02:42:34:82:13:1b txqueuelen 0 (Ethernet)
RX packets 26412 bytes 1093233 (1.0 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 46985 bytes 73051780 (69.6 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
#3.网络配置:Docker允许用户自定义容器的网络配置,包括指定网络类型、指定网络端口等。
网络模式
#安装Docker时,它会自动创建三个网络。bridge、 none 、host。
docker network create my-network #创建一个默认的 bridge 网络
docker run -itd --network=my-network centos_10 /bin/bash
docker network ls
docker run -itd --network=[网络类型] -p 13000:8080 -v /root/tomcat:/usr/local/tomcat/webapps/ROOT tomcat:8

ffa587aaa8a504b333fabc75e0e4c112