Docker 安装 和 使用
一、docker安装
docker是管理容器的引擎
中文手册:https://vuepress.mirror.docker-practice.com/
中文手册(新):https://yeasy.gitbook.io/docker_practice/
一、安装
1、安装步骤
https://docs.docker.com/engine/install/binaries/
1.1 下载
下载路径:
https://download.docker.com/linux/static/stable/x86_64/
我下载的是 docker-19.03.9.tar
1.2 上传
用ftp工具上传到/opt目录
1.3 解压
[root@localhost opt]# tar -zxf docker-19.03.9.tar
1.4 拷贝到 /usr/bin
将docker 相关命令拷贝到 /usr/bin,方便直接运行命令
[root@localhost opt]# sudo cp docker/* /usr/bin/
1.5 启动Docker守护程序
执行下面这句,等一会儿~
[root@localhost opt]# sudo dockerd &
1.6 验证是否安装
执行docker info命令,若正常打印版本信息则安装成功。
[root@localhost opt]# docker info
2、注册系统服务
2.1、先停止docker进程
2.2、创建并写入
在 /usr/lib/systemd/system/ 目录下创建docker.service 文件
[root@localhost ~]# sudo vi /usr/lib/systemd/system/docker.service
文件内容
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
2.3、启动停止查看状态
[root@localhost ~]# systemctl start docker.service
[root@localhost ~]# systemctl stop docker.service
[root@localhost ~]# systemctl restart docker.service
[root@localhost ~]# systemctl status docker.service
2.4、docker开机自启,开启/取消
[root@localhost ~]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@localhost ~]# systemctl disable docker
Removed symlink /etc/systemd/system/multi-user.target.wants/docker.service.
3、配置阿里云镜像
自己在查查 daemon.json 这文件什么意思吧,默认没有,更换镜像源用到这个了
这是官方文档:https://docs.docker.com/engine/reference/commandline/dockerd/
创建并写入
路径:/etc/docker/daemon.json
[root@localhost ~]# vi /etc/docker/daemon.json
{
"data-root":"/mnt/docker-data",
"storage-driver": "overlay2",
"graph":"/var/lib/docker",
"registry-mirrors":[
"https://q2gr04ke.mirror.aliyuncs.com"
]
}
上面的意思,官网解释:https://docs.docker.com/config/daemon/systemd/#custom-docker-daemon-options
{
"data-root":"/mnt/docker-data",//控制用于 Docker 映像、容器和卷的磁盘空间。
"storage-driver": "overlay2",
"graph":"/var/lib/docker",//这个相当于是安装目录,linux默认就是这个目录
"registry-mirrors":[
"https://q2gr04ke.mirror.aliyuncs.com" //拉取镜像的地址,这是阿里云的,可以配置多个,以逗号分割
]
}
修改了配置文件要重新加载
sudo systemctl daemon-reload
重启服务测试
[root@kj-gitlab docker]# systemctl restart docker.service
如果启动不了,说明配置文件有错
4、拉取镜像
现在安装的docker里面是没有任何镜像的
查看命令
[root@localhost ~]# docker images
4.1、官网镜像地址
每个镜像里面也有教程,自己看看吧
4.2、装一个MySQL
例子:https://hub.docker.com/_/mysql
4.2.1、拉取命令
4.2.1、找到MySQL的拉取
[root@localhost ~]# docker pull mysql:8.0
4.2.2、创建MySQL目录
说明:用于存放MySQL相关配置文件
- mkdir -p :递归创建目录,即使上级目录不存在,会按目录层级自动创建目录
- : ”/“是根目录,”~“是家目录。Linux存储是以挂载的方式,相当于是树状的,源头就是”/“,也就是根目录。
而每个用户都有”家“目录,也就是用户的个人目录,比如root用户的”家“目录就是/root,普通用户a的家目录就是/home/a
[root@localhost /]# mkdir -p ~ /mnt/common/mysql/{data,conf,logs}
4.2.2、创建MySQL实例
# 格式
docker run [参数] [镜像名称] [运行容器的启动命令]
# 参数
-d : 以守护进程的方式运行一个容器
docker run -d [镜像名称] [cmd]
--name : 指定容器的名称
docker run -d --name [容器名称] [镜像的名称] [cmd]
-p : 指定端口映射
docker run -d -p 宿主主机端口:容器内端口 [镜像名称] [cmd]
-P :随机端口映射
docker run -d -P [镜像名称] [cmd]
-i : 打开标准输出
-t : 创建一个伪终端
docker run -it [镜像名称] [cmd]
-v : 挂载目录到容器中
docker run -v 宿主主机目录:容器内目录 [镜像名称] [cmd]
--rm : 容器生命周期结束时立即删除
docker run --rm [镜像名称] [cmd]
-e : 在容器中创建一个环境变量
docker run -e NAME=Centos -d [镜像名称] [cmd]
--link : 连接上一个容器,实现网络互通
docker run --link 被连接的容器的名称:连接别名 [镜像名称] [cmd]
-h : 设置容器主机名
docker run -h "主机名" [镜像名称] [cmd]
# docker run 运行流程
1、检查本地是否用指定镜像,如果没有则去对应的仓库下载镜像
2、启动容器,如果指定了命令则使用指定的命令,如果没有则使用默认的命令
3、返回容器ID
docker run -p 3306:3306 -p 33060:33060 --name common-mysql8 -v ~ /mnt/common/mysql/conf:/etc/mysql/conf.d -v ~ /mnt/common/mysql/logs:/logs -v ~ /mnt/common/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0
[root@localhost /]# docker run \
--restart=always --privileged=true \
-p 3306:3306 --name common-mysql8 \
-v /mnt/common/mysql/conf:/etc/mysql/conf.d \
-v /mnt/common/mysql/logs:/logs \
-v /mnt/common/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:8.0
4.2.3、查看容器位置
[root@localhost ~]# docker inspect 容器id
其中,Path 为容器的运行位置(指令),HostPath 为容器的所在位置。
4.2.4、查看已安装的所有容器
[root@localhost ~]# docker ps -a
4.2.5、删除指定容器
[root@localhost ~]# docker rm common-mysql
4.2.7、创建docker后修改挂在目录的方法
还没有实际操作
借鉴:https://blog.csdn.net/weixin_42405819/article/details/118652365
4.3、装一个Nginx,和部署
官网教程:https://hub.docker.com/_/nginx
nginx官网下载地址:http://nginx.org/en/download.html
4.3.1 下载nginx镜像
[root@localhost ~]# docker pull nginx:1.18.0
4.3.2 启动镜像和挂载
注意要单文件映射,比如nginx.config,官网教程给的方案
nginx.config
用nginx官网下载的就可以
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
#include /etc/nginx/conf.d/*.conf;
upstream gateway {
server 127.0.0.1:8801;
server 127.0.0.1:8801;
server 127.0.0.1:8801;
}
server {
listen 2004;
server_name web;
#如果docker部署,这里面应该是容器中的位置
#进入容器后 find / -name index.html 就可以显示出来
root /usr/share/nginx/html/dist;
location / {
}
location ^~/api {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_buffering off;
rewrite ^/api/(.*)$ /$1 break;
proxy_pass http://gateway;
}
}
}
[root@localhost ~]# sudo docker run --name sd-nginx -p 20004:20004 \
-v /mnt/nginx/nginx-1.18.0/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /mnt/nginx/nginx-1.18.0/html/dist:/usr/share/nginx/html/dist \
-v /mnt/nginx/nginx-1.18.0/logs:/var/log/nginx \
--privileged=true \
-d nginx:1.18.0
二、卸载
1、卸载步骤
如果不小心直接删除了,需要重启一下linux
[root@localhost ~]# reboot
停止docker
[root@localhost ~]# systemctl stop docker
删除docker
[root@localhost ~]# rm -rf /var/lib/docker/
删除注册的服务
删除usr/bin
这个需要根据安装的时候解压出来后的文件,删除相对应的就可以
[root@localhost docker]# rm -rf /usr/bin/dockerd
[root@localhost docker]# rm -rf /usr/bin/docker-init
[root@localhost docker]# rm -rf /usr/bin/docker-proxy
[root@localhost docker]# rm -rf /usr/bin/runc
[root@localhost docker]# rm -rf /usr/bin/containerd
[root@localhost docker]# rm -rf /usr/bin/containerd-shim
[root@localhost docker]# rm -rf /usr/bin/ctr
[root@localhost docker]# rm -rf /usr/bin/docker
systemctl stop docker \
&& systemctl disable docker \
&& yum -y remove docker-ce docker-ce-cli containerd.io \
&& rm -rf /var/lib/docker \
&& rm -rf /var/lib/containerd
三、dockerfile
3.1 dockerfile文件
dockerfile 用于构建docker镜像
3.1 dockerfile基本结构
基础信息、维护者信息、镜像操作指令、容器启动时执行指令
3.2 dockerfile指令
FROM
格式为 from 或 from:
dockerfile 文件第一条指令必须为from指令。并且,如果在同一个dockerfile中创建多个镜像时,可以用多个from指令(每个镜像一次)
MAINTAINER
格式为 MAINTAINER
ENV
格式为 EVN
ADD
格式为 ADD
复制指定的
EXPOSE
格式为 expose
告诉docker服务器容器暴露的端口,供互联系统使用,在启动容器时需要通过-p映射端口,docker 主机会自动分配一个端口转发到指定端口;
RUN
格式为 RUN
run 指定将在当前镜像基础上执行指定命令,并提交为新的镜像,当命令较长时可以使用\来换行
CMD
格式为command: ["test.jar"]
指定启动容器时执行的命令,每个dockerfile只能有一条cmd命令。如果制定了多条命令,只有最后一条会被执行。如果用户启动容器时候制定了运行的命令,则会覆盖cmd指定的命令。
3.1、docker部署jar包spring boot程序
3.1.1 定义jar包程序dockerfile文件
from java
maintainer xxx
add spring boot-web-1.0.0.jar
run chmod +x /opt/springboot-web-1.0.0.jar
cmd java -jar /opt/springboot-web-1.0.0.jar
3.3 自定义镜像
3.3.1 自定义jdk镜像
3.3.1.1 Dockerfile文件
创建文件,固定格式为 Dockerfile
[root@localhost opt]# vim Dockerfile
内容:
FROM centos:latest
MAINTAINER ict
ADD jdk-8u361-linux-x64.tar.gz /usr/local
ENV JAVA_HOME /usr/local/jdk1.8
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH $PATH:$JAVA_HOME/bin
CMD JAVA -version
3.3.1.2 构建和运行jdk
-t:指定名字
.:表示在当前目录下有个Dockerfile文件
[root@localhost opt]# docker build -t jdk:8u361 .
完成之后,查看 docker iamges,名字 和标签可能为none
修改一下
[root@localhost opt]# docker tag 6015ffec3ed9 jdk:1.8
运行容器
docker run -d xxxxx容器id
3.3.2 自定义MySQL镜像
3.3.2.1 Dockerfile文件
#用centos6
FROM centos:centos6
MAINTAINER ict
RUN yum install mysql-server mysql -y
#让服务进程启动
RUN /etc/init.d/mysqld start &&\
#授权root外网
mysql -e "grant all privileges on *.* to 'root'@'%' identified by 'root' WITH GRANT OPTION;"&&\
#授权root内网
mysql -e "grant all privileges on *.* to 'root'@'localhost' identified by 'root' with grant opiton;"&&\
mysql -uroot -proot -e "show databases;"
EXPOSE 3306
CMD /usr/bin/mysqld_safe
3.3.2.2 构建和运行MySQL
构建
docker build -t ict-mysql .
运行
docker run -d 3306:3306 xxxxxx
3.3.3 自定义redis镜像
3.3.3.1 下载镜像
[root@localhost _backup]# docker pull redis:6.2.8
3.3.3.2Dockerfile文件
3.3.3.3 构建镜像
3.3.3.4 启动容器和挂载
docker run --restart=always -p 6379:6379 --name sd-redis \
-v /mnt/common/redis/redis-6.2.8/redis.conf:/etc/redis/redis.conf \
-v /mnt/common/redis/redis-6.2.8/data:/data \
-d redis:6.2.8 redis-server
3.3.3.3 测试
[root@localhost _backup]# docker exec -it 412dd15ce7c5 redis-cli
3.3.4 自定义tomcat镜像
准备工作:jdk、tomcat 压缩包
3.4.4.1 Dockerfile文件
FROM centos
MAINTAINER xxx & xxx@email.com
# readme.txt 可用可不用
COPY readme.txt /usr/local/readme.txt
# 将java和tomcat添加到容器中
ADD jdk-8u351-linux-x64.tar.gz /usr/local
ADD apache-tomcat-8.5.85.tar.gz /usr/local
# 安装vim编辑器
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 wget
RUN wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo \
&& yum clean all \
&& yum makecache
RUN yum -y install vim
# 设置工作路径
ENV WORKPATH /usr/local
WORKDIR $WORKPATH
# 配置java和tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_351
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.85
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
# 容器运行时监听的端口
EXPOSE 8080
# 启动时运行tomcat
CMD /usr/local/apache-tomcat-8.5.85/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.85/bin/logs/catalina.out
3.4.4.2 构建和运行tomcat
构建镜像
[root@localhost tomcat]# docker build -t sd-tomcat:8.5.85 .
启动和运行
[root@localhost tomcat]# docker run -d -p 8080:8080 --name sd-tomcat \
-v /mnt/tomcat/apache-tomcat-8.5.85/webapps:/usr/local/apache-tomcat-8.5.85/webapps \
-v /mnt/tomcat/apache-tomcat-8.5.85/logs:/usr/local/apache-tomcat-8.5.85/logs \
--privileged=true \
sd-tomcat:8.5.85
3.3.5 自定义Nginx镜像
看在线安装的,这个不用自定义,启动挂载就可
3.3.6 自定义jar镜像
这个虽然能用,但是有问题,不完善 from有问题。
3.3.6.1 Dockerfile
#FROM bladex/alpine-java:openjdk8-openj9_cn_slim
FROM jerrydo/java:8u212
MAINTAINER xxxxx@163.com
RUN mkdir -p /web
WORKDIR /web
EXPOSE 8800
ADD app.jar ./app.jar
ENV PARAMS=""
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom $PARAMS", "-jar", "app.jar"]
CMD ["--spring.profiles.active=test"]
3.3.6.2 构建镜像
[root@localhost _backup]# docker build -t sd-boot .
3.3.6.3 启动和运行
[root@localhost _backup]# docker run -d --name=sd-boot -p 8800:8800 \
-v /mnt/shendong/web/jar/app.jar:/web/app.jar \
-v /mnt/shendong/web/jar/logs:/web/target/blade/log \
sd-boot
四、docker命令
1、docker命令
启动Docker守护程序
[root@localhost opt]# sudo docker &
验证是否安装,执行docker info命令,若正常打印版本信息则安装成功。
[root@localhost opt]# docker info
启动docker
[root@localhost docker]# systemctl start docker
停止docker
[root@localhost docker]# systemctl stop docker
重启docker
[root@localhost docker]# systemctl restart docker
2、镜像命令
删除镜像
[root@localhost docker]# docker image rmi e290eb1c4f8c[IMAGE ID]
批量删除镜像 根据关键字 192.168.142.134:71/tydt-cloud 为关键字
[root@localhost docker]# docker rmi --force `docker images | grep tydt-cloud | awk '{print $3}'`
删除所有镜像
[root@localhost docker]# docker rmi --force $(docker images -q)
删除删除Tag为空的镜像
[root@localhost docker]# docker images|grep none|awk '{print $3}'|xargs docker rmi -f
3、容器命令
运行一个容器
docker run -it minio-backup-ip-10.110.56.161:v20240622 bash
所有容器
查看所有容器
[root@localhost docker]# docker ps -a
强制删除容器
[root@localhost docker]# docker rm -f xxx容器id或者容器名称
开启容器
[root@localhost docker]# docker start xxx容器id或者容器名称
运行中
查看运行中容器
[root@localhost docker]# docker ps
进入容器
[root@localhost docker]# docker exec -it 47910b51e2ea bash
退出容器
[root@localhost docker]# exit
查看某一个容器的更多信息
[root@localhost docker]# docker inspect xxxx容器id
停止容器
[root@localhost docker]# docker stop xxx容器id或者容器名称
停止全部运行中的容器
[root@localhost docker]# docker stop $(docker ps -q)
删除全部容器(运行中的不删除)
[root@localhost docker]# docker rm $(docker ps -aq)
停止并删除所有容器
[root@localhost docker]# docker stop $(docker ps -q) & docker rm $(docker ps -aq)
把文件复制到容器里面
[root@localhost docker]# docker cp /root/ 容器id/容器目录位置
查看运行中实时容器日志
[root@localhost docker]# docker logs -f efb78392dsfg
查看最近10条日志, 并持续打印
[root@localhost docker]# docker logs -f --tail 10 efb78392dsfg
查看某个日期至今的所有日志, 并持续打印
[root@localhost docker]# docker logs -f --since "2022-05-16" efb78392dsfg
4、网桥命令
查看所有网桥
[root@localhost docker]# docker network ls
五、管理容器
管理容器日志
临时清理日志文件 找到大容器的日志文件进去,执行下面命令,就清空了。
cat /dev/null > *-json.log
如果用的是 docker-compose 可以单独设置,就会忽略全局配置
services:
nacos:
image: nacos/nacos-server:v2.1.1
#container_name: nacos-standalone
env_file:
- ./nacos-docker/nacos/env/nacos-standlone-mysql.env
volumes:
- ./nacos-docker/nacos/standalone-logs/:/home/nacos/logs
ports:
- "8848:8848"
- "9848:9848"
# 这里是配置日志的
logging:
driver: "json-file"
options:
max-size: "200m"
max-file: "1"
depends_on:
nacos-mysql:
condition: service_healthy
networks:
- net_230
官网:JSON 文件日志记录驱动程序 |码头工人文档 (docker.com)
选择 | 描述 | 示例值 |
---|---|---|
max-size |
日志滚动之前的最大大小。一个正整数加上一个表示度量单位 (、 或 ) 的修饰符。默认值为 -1(无限制)。k``m``g |
--log-opt max-size=10m |
max-file |
可以存在的最大日志文件数。如果滚动日志会创建多余的文件,则会删除最旧的文件。仅在也设置时有效。max-size 正整数。默认值为 1。 |
--log-opt max-file=3 |
labels |
在启动 Docker 守护程序时应用。此守护程序接受的与日志记录相关的标签的逗号分隔列表。用于高级日志标记选项。 | --log-opt labels=production_status,geo |
labels-regex |
与 类似且兼容。用于匹配与日志记录相关的标签的正则表达式。用于高级日志标记选项。labels |
`--log-opt labels-regex=^(production_status |
env |
在启动 Docker 守护程序时应用。此守护程序接受的与日志记录相关的环境变量的逗号分隔列表。用于高级日志标记选项。 | --log-opt env=os,customer |
env-regex |
与 类似且兼容。用于匹配与日志记录相关的环境变量的正则表达式。用于高级日志标记选项。env |
`--log-opt env-regex=^(os |
compress |
切换旋转日志的压缩。默认值为 。disabled |
--log-opt compress=true |
此示例启动一个最多可以有 3 个日志的容器 每个文件不超过 10 MB。alpine
$ docker run -it --log-opt max-size=10m --log-opt max-file=3 alpine ash
修改或者添加配置文件,这里控制所有的docker容器
[root@localhost docker]# vi /etc/docker/daemon.json
-
max-size:每个容器的每个 xxx-json.log 文件的最大值
-
max-file:每个容器的 xxx-json.log 日志文件的保存数量
{
"graph":"/var/lib/docker",
"registry-mirrors":["https://q2gr04ke.mirror.aliyuncs.com"],
"insecure-registries":["192.168.142.134:71"],
"log-driver":"json-file",
"log-opts": {"max-size":"5k", "max-file":"1"}
}
重新加载配置
[root@localhost docker]# sudo systemctl daemon-reload
重新启动 Docker 以使更改对新创建的容器生效。 现有容器不使用新的日志记录配置。
[root@localhost smart-park]# systemctl restart docker.service
FAQ:
如果有问题,查看Linux系统操作日志(最后200行就可以排查):
tail -200f /var/log/messages
1 安装完毕后,通过systemctl start docker启动直接报错:
Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.
2 failed to start daemon: error while opening volume store metadata database: timeout