docker学习记录
docker快捷命令
#删除所有容器
docker rm -f $(docker ps -aq)
#删除所有镜像
docker rmi -f $(docker images -aq)
#查看网络
ip addr
Centos8停更—转Conter stream
CentorOS 8.2下载失败
$ sudo sed -i -e "s|mirrorlist=|#mirrorlist=|g" /etc/yum.repos.d/CentOS-*
$ sudo sed -i -e "s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g" /etc/yum.repos.d/CentOS-*
$ yum update
查看当前内核版本
uname -r
使用 root 权限更新 yum 包
yum -y update 注意 yum -y update:升级所有包同时也升级软件和系统内核; yum -y upgrade:只升级所有包,不升级软件和系统内核
docker安装
1.卸载旧版本
yum remove docker docker-common docker-selinux docker-engine
-
卸载
systemctl stop docker #停止docker yum -y remove docker-ce docker-ce-cli containerd.io #卸载 sudo rm -rf /var/lib/docker #删除目录 sudo rm -rf /var/lib/containerd #删除目录
-
安装需要的软件包, yum-util 提供yum-config-manager功能,另两个是devicemapper驱动依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
2. 设置 yum 源
yum-config-manager --add-repo http://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.选择docker版本并安装
查看docker列表
yum list docker-ce --showduplicates | sort -r # 默认最新版安装 yum install docker-ce docker-ce-cli containerd.io
安装版本
sudo yum install docker-ce 版本号
启动并加入开机启动
sudo systemctl start docker #启动docker sudo systemctl enable docker #加入开机启动项
2.1配置阿里云镜像加速
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://affyvopl.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reloadsudo sudo systemctl restart docker
2.2配置腾讯云镜像加速
#创建或修改 /etc/docker/daemon.json 文件,并写入以下内容:
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com"
]
}
EOF
#依次执行以下命令,重新启动 Docker 服务。
systemctl daemon-reload
service docker restart
#检查是否生效
docker info
#在返回信息最底下有如下信息则表示成功
#Registry Mirrors:
# https://mirror.ccs.tencentyun.com
#重启docker服务
systemctl restart docker.service
5.验证安装是否成功(有client和service两部分表示docker安装启动都成功了)
docker version
Docker拉取镜像
常用命令
liunk命令
#新建文件夹
mkdir 文件夹名
#新建文件
touch 文件名
#强制删除文件
rm -rf 文件夹名
#查看当前目录
pwd
#移动文件夹
mv 文件名/文件夹名 目的路径
#更新系统
apt update
#下载ip查看命令
apt install -y iproute2
#下载安装ping命令
apt-get install inetutils-ping
帮助命令
docker version #docker版本
docker info #docker信息
docker [命令] --help #查看docker命令
镜像命令
docker image 镜像搜索下载地址
docker pull [镜像名:tag] #拉取镜像,不加tag,默认最新版
docker image rm [image] #删除镜像 格式:镜像名:tag 也可以通过ID来删
docker rmi -f [image] #删除镜像 格式:镜像名:tag 也可以通过ID来删
docker rmi -f $(docker images -qa) #递归删除所有镜像
docker history 镜像ID #镜像的历史
#容器添加tag
docker tag 容器ID 账号/newname:tag
容器命令
#从宿主机拷贝文件到容器
#查看容器具体信息
docker inspect 容器ID
#进入正在运行的容器
docker attach 容器ID
#强制删除容器
docker rm -f 容器ID
参数说明
#docker run 命令参数
-p 主机端口:容器内端口
-v 主机目录:容器内目录
-d 后台运行
-t 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-i 以交互模式运行容器,通常与 -t 同时使用;
--volumes-from 继承容器数据卷进行共享
Docke常用环境安装配置
redis
- 先去官网下载对应版本的配置文件
#新建映射文件
$ mkdir /data/redis
$ mkdir /data/redis/data
#创建容器并映射配置文件
docker run -p 6379:6379 --name redis \
-v /data/redis/data/redis.conf:/etc/redis/redis.conf \
-v /data/redis/data:/data
-d redis redis-server /etc/redis/redis.conf --appendonly yes
-
配置文件设置
-
bind 127.0.0.1 注释掉,要不只能本机访问
-
requirepass 连接外网的,建议设置密码
-
MySql
#下载镜像
docker pull mysql:8.0
#创建目录
#运行容器,做数据挂在
docker run -itd --name mysql-test -p 3306:3306 -v /home/mybluet/mysql/conf:/etc/mysql/conf.d -v /home/mybluet/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=cc2356 mysql
#注意
如果创建一次挂载到宿主机成功,删除后重新创建容器并挂载,。密码等配置文件依然为第一次创建的内容
nginx
1.安装docker(复制里面的测试文件)
docker run --name nginx-test -p 80:80 -d nginx
docker start nginx-test
- 将nginx关键目录映射到本机
mkdir -p /root/nginx/www /root/nginx/logs /root/nginx/conf
#www: nginx存储网站网页的目录
#logs: nginx日志目录
#conf: nginx配置文件目录
docker ps -a #查看容器id
#将nginx-test容器配置文件copy到本地
$ docker cp 容器id:/etc/nginx/nginx.conf /root/nginx/conf
#停止nginx-test服务
docker stop nginx-test
#创建容器,完成映射
docker run -d -p 80:80 --name nginx-web -v /root/nginx/www:/usr/share/nginx/html
-v /root/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
-v /root/nginx/logs:/var/log/nginx nginx
#启动nginx
docker start nginx-web
nacos
1.挂载目录
mkdir -p /mydata/nacos/logs/ #新建logs目录
mkdir -p /mydata/nacos/init.d/
2.初始化数据库表
-
创建名为nacos的数据库
-
运行 nacos-mysql.sql文件建表[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fXoYILr0-1652508447382)(E:\Note\md\Docker.assets\watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NTk1NzY5,size_16,color_FFFFFF,t_70.png)]
-
修改配置文件application.properties
vim /mydata/nacos/init.d/application.properties #配置内容如下 # spring server.contextPath=/nacos server.servlet.contextPath=/nacos server.port=8848 spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://localhost:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC db.user=root db.password=root # nacos.cmdb.dumpTaskInterval=3600 # nacos.cmdb.eventTaskInterval=10 # nacos.cmdb.labelTaskInterval=300 # nacos.cmdb.loadDataAtStart=false # metrics for prometheus #management.endpoints.web.exposure.include=* # metrics for elastic search management.metrics.export.elastic.enabled=false #management.metrics.export.elastic.host=http://localhost:9200 # metrics for influx management.metrics.export.influx.enabled=false #management.metrics.export.influx.db=springboot #management.metrics.export.influx.uri=http://localhost:8086 #management.metrics.export.influx.auto-create-db=true #management.metrics.export.influx.consistency=one #management.metrics.export.influx.compressed=true server.tomcat.accesslog.enabled=true server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i # default current work dir server.tomcat.basedir= ## spring security config ### turn off security #spring.security.enabled=false #management.security=false #security.basic.enabled=false #nacos.security.ignore.urls=/** nacos.security.ignore.urls=/,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/login,/v1/console/health/**,/v1/cs/**,/v1/ns/**,/v1/cmdb/**,/actuator/**,/v1/console/server/** # nacos.naming.distro.taskDispatchPeriod=200 # nacos.naming.distro.batchSyncKeyCount=1000 # nacos.naming.distro.syncRetryDelay=5000 # nacos.naming.data.warmup=true # nacos.naming.expireInstance=true nacos.istio.mcp.server.enabled=false
-
启动nacos容器
docker run \ --name nacos -d \ -p 8848:8848 \ --privileged=true \ --restart=always \ -e JVM_XMS=256m \ -e JVM_XMX=256m \ -e MODE=standalone \ -e PREFER_HOST_MODE=hostname \ -v /mydata/nacos/logs:/home/nacos/logs \ -v /mydata/nacos/init.d/application.properties:/home/nacos/init.d/custom.properties \ nacos/nacos-server
minio
docker run \
-p 9000:9000 \
-p 9090:9090 \
-d \
--name minio \
-v /mydata/minio/data:/data \
-v /mydata/minio/config:/root/.minio \
-e "MINIO_ROOT_USER=用户名" \
-e "MINIO_ROOT_PASSWORD=密码" \
minio/minio server /data --console-address ":9090"
jetty
docker run -d --name jetty -p 8080:8080 -v /opt/webapps:/usr/local/jetty/webapps jetty
/var/lib/jetty/webapps
docker run -d --name jetty -p 8080:8080 -v /opt/webapps:/var/lib/jetty/webapps jetty
Docker提交一个自己的镜像
commit镜像
docker commit -m="提交描述信息" -a="作者" 容器ID 目标镜像:[tag]
容器数据卷(容器数据持久化)
将容器中的数据挂在到宿主机中
#创建centos容器,并挂在home文件在test中,创建成功后进入容器
docker run -it -v /home/test:/home centos /bin/bash
容器文件挂分类
#具名挂载
$ docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx nginx
#匿名挂载
$ docker run -d -P --name nginx01 -v /etc/nginx nginx
#指定挂载目录
$ docker run -d -P --name nginx01 -v /home/nginx:/etc/nginx nginx
#查看匿名和具名挂载目录
$ docker volume ls
local 808ca988229ef9cffba838de3c634d3e93cd42a5ad00876f296a57d0914246ef
local cbd513b99b825527c8c8a8e544f6cdeeb9384cfd513133f6f8546e6d05bf6c25
local d96070683262650cd5d0439355450803f6b2e0aae7e6faa7ddbf0a62ea500fdb
local e9cbac0b341c5527c5a96527e75e206f222ee04ee2bef2cad0eafc5ff1172178
local e83c65e92b45b4f961ac656480479c0fcf356f786d055115a85f1236a43fe76d
local ec05750ae89c9a7bf65007e4d44ac328c1fc79fb0a807295e270a10435ef53c7
local juming-nginx
local portainer_data
#具名和匿名挂载目录查看
$ volume inspect juming-nginx
[
{
"CreatedAt": "2022-05-12T15:59:33+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
#挂载目录全在/var/lib/docker/volumes docker的工作目录中
拓展
#容器挂载读写权限 ro,rw(默认为rw),当权限为ro时,容器中挂载的文件只能通过宿主机来修改,容器内部是无法操作的
$ docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:ro nginx
数据卷容器同步
注:共享数据卷通过互相复制同步,如果第一个容器数据卷挂载持久化到宿主机,那么宿主机中的数据不会丢失;如果是Dockerfile直接挂载则是互相复制模式
#生成第一个mysql容器,挂载容器到宿主机
docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
#生成第二个mysql容器,使用--volumes-from进行集成msyql01容器的挂在卷,实现数据共享
docker run -d -p 3311:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 mysql:5.7 --volumes-from mysql01 mysql:5.7
Dockerfile
指令说明
集合
FROM | 基础镜像,一切从这里构建 |
---|---|
MAINIAINER | 镜像构建作者,一般姓名加邮箱 |
RUN | 镜像构建的时候需要运行的命令 |
ADD | 步骤:tomcat镜像,这个运行文件的压缩包!添加内容 |
WORKID | 镜像的工作目录 |
VOLUME | 挂载的目录 |
EXPOSE | 保留的端口配置 |
CMD | 指定这个容器启动的时候需要运行的命令,只有最后一个会生效,可被替代 |
ENTRYPOINT | 指定这个容器启动的时候要运行的命令,可以追加命令 |
ONBUILD | 当构建一个被继承DockerFile 这个时候就会运行ONBUILD 的指令,触发指令 |
COPY | 类似ADD 将我们文件拷贝到镜像中 |
ENV | 构建的时候设置镜像变量 |
CMD和ENTRYPOINT的区别
#运行容器时后面加参数会直接替换CMD中的命令
#ENTRYPOINT会在命令后追加
#例:
CMD ["ls","-a"]
ENTRYPOINT ["ls","-a"]
docker run 镜像ID -l #-l cmd会直接替换,ENTRYPOINT则追加
CMD ["-l"]
ENTRYPOINT ["ls","-a","-l"]
牛刀小试
编写dockerfile文件
FROM centos
MAINTAINER bluet<1658439491@qq.com>
ENV MYPATH /usr/local #全局变量
WORKDIR $MYPATH #设置工作目录
RUN yum -y install vim #下载vim
RUN yun -y install net-tools #下载工具
EXPOSE 80 #暴露端口80
CMD echo $MYPATH
CMD echo -----end------
CMD /bin/bash
通过dockerfile构建镜像
docker build -f [dockerfile文件路径] -t 镜像名:[tag]
制作tomcat镜像
#创建说明文件和Dockerfile
touch readme.txt
vim Dockerfile
#执行Dockerfile文件生成镜像diytomcat
docker build -t diytomcat .
#创建容器,挂载项目和日志
docker run -d -p 9090:8080 --name bluettomcat -v /home/tomcat/test:/usr/local/apache-tomcat-9.0.62/webapps/test -v /home/tomcat/tomcatlogs:/usr/local/apache-tomcat-9.0.62/logs diytomcat
#--------------------------------------------------------beg-----------------------------------------------------------------
#dockerfile文件
FROM centos:7
MAINTAINER bluet<CYS1658439491@outlook.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u333-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.62.tar.gz /usr/local
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_333
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.62
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.62
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.62/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.62/bin/logs/catalina.out
#-----------------------------------------------------end-------------------------------------------------------------------
注:JAVA_HOME解压后JDK文件名,有的为java,有的为jdk,注意查看
发布镜像
发布到docker hub默认仓库
#修改镜像tag
docker tag eb6bd5eb2ae9 cysindocher/diytomcat:1.0
#发布镜像
docker push cysindocher/diytomcat:1.0
发布到阿里云镜像仓库
#退出登录
docker logout
#登录登录阿里云Docker Registry
docker login --username=手机号 registry.cn-hangzhou.aliyuncs.com
#生成镜像版本号
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/bluet/yunsong_test:[镜像版本号]
#提交镜像到仓库
docker push registry.cn-hangzhou.aliyuncs.com/bluet/yunsong_test:[镜像版本号]
#选择合适的镜像仓库地址
#从ECS推送镜像时,可以选择使用镜像仓库内网地址。推送速度将得到提升并且将不会损耗您的公网流量。
#如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-hangzhou.aliyuncs.com 作为Registry的域名登录。
镜像本地拷贝
#打包镜像
docker save --help
#读取镜像
docker load --help
Docker网络
查看网络地址
#查看网络地址
ip addr
#lo:本机回环地址、eth0:内网地址、docker0:docker地址
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 52:54:00:52:67:33 brd ff:ff:ff:ff:ff:ff
inet 10.0.4.2/22 brd 10.0.7.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fe52:6733/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:43:78:42:49 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:43ff:fe78:4249/64 scope link
valid_lft forever preferred_lft forever
容器连通
#通过Docker0网络联通,由docker0统一管理IP地址,docker0相当于路由器,将容器连通
#--link连通,可以直接通过容器name连通,(新版本已弃用)
docker run -d -P --name tomcat03 --link tomcat02 tomcat
#原理查看,容器中host目录,添加了对应的目录
docker exec -it tomcat03 cat /etc/hosts
127.18.0.3 tomcat2 s48fesef85e
自定义网络
#查看docker网络
docker network ls
#移除网络
docker network rm 网络ID
#创建一个自定义网络
#--driver bridge 网络模式-桥接
# --subnet 192.168.0.0/16 网络长度 /16:192.168.0.1-192.168.255.255
#--geteway 指定网关IP
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
#创建容器并指定网络
docker run -d -P --name tomcat01 --net mynet tomcat
#不同网络之间容器连通容器
#mynet:网络名 tomcat01:其他网络的容器名
docker network connect mynet tomcat01
Docker Compose
docker-compose命令解析
docker-compose # 拉取镜像
docker-compose up -d nginx # 运行nginx容器
docker-compose up -d # 运行所有容器
docker-compose ps # 查看容器运行状态
docker-compose down # 停止容器和容器网络
docker-compose rm nginx # 删除nginx容器
安装
-
下载链接 直接下载下来liunk二进制文件,放入 /usr/local/bin,
-
执行命令 -添加可执行权限
$ sudo chmod +x /usr/local/bin/docker-compos #测试 $ docker-compose --version
部署步骤
- 打包微服务
- dockerfile镜像构建
- docker-compose.yaml编排项目
- 上传服务器运行 docker-compose up
dockerFile编写规则
#下载镜像
docker pull portainer/portainer
#单机部署
docker run -d -p 9001:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data --name prtainer portainer/portainer
dockerFile执行
//构建镜像命令
docker build -t gatway-bluet:1.0 .
//新建并启动容器
docker run -d -p 8070:8070 --name gatway gatway-bluet:1.0