目录
一、使用官方安装脚本自动安装
安装命令如下:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
也可以使用国内 daocloud 一键安装命令:
curl -sSL https://get.daocloud.io/docker | sh
二、Docker离线安装
1. 下载安装包
可以先下载到本地,然后通过ftp工具上传到服务器上,或者在服务器上使用命令下载
wget https://download.docker.com/linux/static/stable/x86_64/docker-18.06.3-ce.tgz
2. 解压
tar -zxvf docker-18.06.3-ce.tgz
将解压出来的docker文件复制到 /usr/bin/ 目录下
cp docker/* /usr/bin/
3.创建docker.service文件
进入 /etc/systemd/system/
目录,并创建 docker.service
文件,内容如下,这样可以将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
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd --selinux-enabled=false --insecure-registry=127.0.0.1
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
# 此处的–insecure-registry=127.0.0.1(此处改成你私服ip)设置是针对有搭建了自己私服Harbor时允许docker进行不安全的访问,否则访问将会被拒绝。
4. 启动docker
# 给docker.service文件添加执行权限
chmod +x /etc/systemd/system/docker.service
# 重新加载配置文件(每次有修改docker.service文件时都要重新加载下)
systemctl daemon-reload
# 启动
systemctl start docker
# 设置开机启动
systemctl enable docker.service
# 查看docker服务状态
[root@localhost system]# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/etc/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2022-06-28 00:54:47 PDT; 10s ago
Docs: https://docs.docker.com
Main PID: 45475 (dockerd)
CGroup: /system.slice/docker.service
├─45475 /usr/bin/dockerd --selinux-enabled=false --insecure-registry=10.1.20.150
└─45487 containerd --config /var/run/docker/containerd/containerd.toml --log-level info
Jun 28 00:54:46 localhost.localdomain dockerd[45475]: time="2022-06-28T00:54:46.158519178-07:00" level=info msg="ccResolverWrapper: sending update to cc: {[{unix:///var/run/docker/containerd..." module=grpc
Jun 28 00:54:46 localhost.localdomain dockerd[45475]: time="2022-06-28T00:54:46.158525449-07:00" level=info msg="ClientConn switching balancer to "pick_first"" module=grpc
Jun 28 00:54:46 localhost.localdomain dockerd[45475]: time="2022-06-28T00:54:46.202943588-07:00" level=info msg="Loading containers: start."
Jun 28 00:54:47 localhost.localdomain dockerd[45475]: time="2022-06-28T00:54:47.021854086-07:00" level=info msg="Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon...d IP address"
Jun 28 00:54:47 localhost.localdomain dockerd[45475]: time="2022-06-28T00:54:47.126281901-07:00" level=info msg="Firewalld: interface docker0 already part of docker zone, returning"
Jun 28 00:54:47 localhost.localdomain dockerd[45475]: time="2022-06-28T00:54:47.244251569-07:00" level=info msg="Loading containers: done."
Jun 28 00:54:47 localhost.localdomain dockerd[45475]: time="2022-06-28T00:54:47.264592112-07:00" level=info msg="Docker daemon" commit=a89b842 graphdriver(s)=overlay2 version=20.10.17
Jun 28 00:54:47 localhost.localdomain dockerd[45475]: time="2022-06-28T00:54:47.265027319-07:00" level=info msg="Daemon has completed initialization"
Jun 28 00:54:47 localhost.localdomain systemd[1]: Started Docker Application Container Engine.
Jun 28 00:54:47 localhost.localdomain dockerd[45475]: time="2022-06-28T00:54:47.300116789-07:00" level=info msg="API listen on /var/run/docker.sock"
Hint: Some lines were ellipsized, use -l to show in full.
# 如上表示docker已安装成功
三、docker常用命令
1. docker常用命令
docker --help #查看docker命令
docker info #docker 详细信息,镜像和容器
docker version #查看docker版本
systemctl start docker #启动docker
systemctl stop docker #关闭docker
systemctl restart docker #重启docker
systemctl enable docker #docker设置随服务启动而自启动
systemctl status docker #查看docker 运行状态------如果是在运行中 输入命令后 会看到绿色的active
docker --help #docker 帮助命令
例如:咱忘记了 拉取命令 不知道可以带哪些参数 咱可以这样使用
docker pull --help
pwd 显示工作路径
shutdown -h now 关闭系统 /halt 关闭系统
shutdown -r now 重启 / reboot 重启
systemctl stop firewalld 关闭防火墙
打包:
(1)将目录 /home/stud/wang 打包成 lvlv.tgz,同时使用 gzip 进行压缩。
tar –czvf lvlv.tgz /home/stud/wang
(2)将 lvlv.tgz 解包到指定目录,同时使用 gzip 进行解压缩。
tar -xzvf lvlv.tgz -C DIR
2. docker镜像命令
1)列出本地镜像:
docker images # 查看docker镜像;
# 具体列解释含义:
REPOSITORY #镜像仓库源
TAG #镜像的标签
IMAGE ID #镜像id
CREATED #创建时间
SIZE #大小
同一个仓库源可以有多个TAG,表示这个仓库源的不同版本,我们使用REPOSITORY:TAG来定义不同的镜像。如果不指定一个镜像的版本标签,例如只使用tomcat,docker将默认使用tomcat:latest镜像
docker images -a #列出本地所有的镜像
docker images -q #只显示镜像ID
docker images --digests #显示镜像的摘要信息
docker images --no-trunc #显示完整的镜像信息
2)查找镜像:
docker search tomcat # 从Docker Hub上查找tomcat镜像
STARS: # 关注度
docker search --filter=stars=300 tomcat #从Docker Hub上查找关注度大于300的tomcat镜像
3. docker镜像下载
docker pull tomcat #从Docker Hub上下载tomcat镜像,默认是最新版本。等价于:docker pull tomcat:latest
docker pull tomcat:8 # 选择指定版本下载
1)删除镜像命令:
A-#单个镜像删除,相当于:docker rmi java:latest
docker rmi java
B-#强制删除(删除正在运行的镜像,注:以后台方式运行的不能被强制删除)
docker rmi -f java
C-#多个镜像删除,不同镜像间以空格间隔
docker rmi -f java tomcat nginx
D-#删除本地全部镜像
docker rmi -f $(docker images -q)
E-#查看所有none镜像
docker images | grep none
F-#查看第一列为none的所有镜像
docker images | grep "^<none>" | awk "{print $3}"
G-#查询所有的none镜像的id
docker images | grep none | awk '{print $3}'
H-#删除所有的none镜像
docker images | grep none | awk '{print $3}' | xargs docker rmi
#更简单的方法
docker rmi `docker images -q -f dangling=true`
或
docker rmi $(docker images -q -f dangling=true)
2)保存镜像
将我们的镜像 保存为tar 压缩文件 这样方便镜像转移和保存 ,然后 可以在任何一台安装了docker的服务器上 加载这个镜像
docker save 镜像名/镜像ID -o 镜像保存在哪个位置与名字
eg:docker save tomcat -o /myimg.tar
3)加载镜像
任何装 docker 的地方加载镜像保存文件,使其恢复为一个镜像
docker load -i 镜像保存文件位置
4)镜像标签
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
docker tag 源镜像名:TAG 想要生成新的镜像名:新的TAG
# 如果省略TAG 则会为镜像默认打上latest TAG
docker tag aaa bbb
# 上方操作等于 docker tag aaa:latest bbb:test
4.docker镜像push到仓库
1)、登录docker hub创建自己的仓库地址:
https://hub.docker.com/repository/create
创建时,仓库名称要与镜像名称对应
2)、linux登录docker仓库
docker login -u 1185223710 # 1185223710 为仓库名称
登录docker仓库,输入密码
3)、将容器变为镜像
// 找到运行中的容器 (复制你要打包的容器的id)
docker ps
// 打包为镜像 (86d78d59b104:容器的id 、 my_centos:我们要打包成的镜像的名字)
docker commit 86d78d59b104 my_centos
// 找到打包的镜像
docker images
4)、将镜像打成标签
// my_centos:镜像的名字 、 1185223710:我们docker仓库的用户名 、 mysql:我们刚才新建的仓库名 、 v1:版本号,可以不设置
docker tag my_centos 1185223710/mysql:v1
5)、将标签上传镜像仓库
// 1185223710/mysql57:v1 对应上面的
docker push 1185223710/mysql57:v1
6)、下载自己的镜像
// 记得先登录
docker login
// 根据版本号拉取
docker pull 1185223710/mysql:v1
7)、登出docker仓库
docker logout
5. docker操作容器
1)查看容器
# 查看正在运行的容器
docker ps
# 查看所有容器 包括停止的容器
docker ps -a
# -q参数,只显示container id
docker ps -q
# 查看容器详细信息
docker inspect demo1
2)容器启动与停止
#新建并启动容器,参数:-i 以交互模式运行容器;-t 为容器重新分配一个伪输入终端;--name 为容器指定一个名称
docker run -i -t --name mycentos 镜像名称/镜像ID
#后台启动容器,参数:-d 已守护方式启动容器
docker run -d mycentos
#启动止容器
docker start 容器id
# 重启容器
docker restart 容器id
# 关闭容器
docker kill 容器id
docker stop 容器id
-t 参数让Docker分配一个伪终端并绑定到容器的标准输入上
-i 参数则让容器的标准输入保持打开。
-c 参数用于给运行的容器分配cpu的shares值
-m 参数用于限制为容器的内存信息,以 B、K、M、G 为单位
-v 参数用于挂载一个volume,可以用多个-v参数同时挂载多个volume
-p 参数用于将容器的端口暴露给宿主机端口 格式:host_port:container_port 或者 host_ip:host_port:container_port
--name 容器名称
--net 容器使用的网络
-d 创建一个后台运行容器
3)容器进入与退出
#使用run方式在创建时进入
docker run -it centos /bin/bash
#关闭容器并退出
exit
#仅退出容器,不关闭
快捷键:Ctrl + P + Q
快捷键:Ctrl + Shift + P + Q
4)容器进程
#top支持 ps 命令参数,格式:docker top [OPTIONS] CONTAINER [ps OPTIONS]
#列出redis容器中运行进程
docker top tomcat
#查看所有运行容器的进程信息
for i in `docker ps |grep Up|awk '{print $1}'`;do echo \ &&docker top $i; done
5)容器日志
# 查看redis容器日志,默认参数
docker logs tomcat
#查看错误输出
docker logs container_name >/dev/null
#查看标准输出日志
docker logs container_name 2>/dev/null
# 查看redis容器日志,参数:-f 跟踪日志输出;-t 显示时间戳;--tail 仅列出最新N条容器日志;
docker logs -f -t --tail=20 redis
# 查看容器redis从2021年08月10日后的最新10条日志。
docker logs --since="2021-08-10" --tail=10 redis
6)进入当前正在运行的容器
通常容器使用后台的方式运行,需要进入容器,修改一些配置;
a:docker exec -it 容器id bashShell(/bin/bash)
b:docker attach 容器id bashShell(/bin/bash)
exec:进入容器后,开启一个新的终端,可以再里面操作;
attach:进入容器正在执行的终端,不会启动新的终端进程;
7)容器文件拷贝 —无论容器是否开启 都可以进行拷贝
#docker cp 容器ID/名称:文件路径 要拷贝到外部的路径 | 要拷贝到外部的路径 容器ID/名称:文件路径
#从容器内 拷出
docker cp 容器ID/名称: 容器内路径 容器外路径
#从外部 拷贝文件到容器内
docker cp 容器外路径 容器ID/名称: 容器内路径
8)查看容器日志
docker logs -f --tail=要查看末尾多少行 默认all 容器ID
9)容器开机自启动
启动容器时,使用docker run命令时 添加参数--restart=always 便表示,该容器随docker服务启动而自动启动
ex:
docker run -itd --name redis002 -p 8888:6379 --restart=always redis:5.0.5 /bin/bash
不想删容器,又想让这个容器设置开机自启动方法如下:
docker update --restart=always 容器Id 或者 容器名
或
docker container update --restart=always 容器Id 或者 容器名
10)更换容器名
docker rename 容器ID/容器名 新容器名
6.docker 运维命令
1)查看docker工作目录
sudo docker info | grep "Docker Root Dir"
2)查看docker磁盘占用总体情况
du -hs /var/lib/docker/
3)查看Docker的磁盘使用具体情况
docker system df
4)删除 无用的容器和 镜像
# 删除异常停止的容器
docker rm `docker ps -a | grep Exited | awk '{print $1}'`
# 删除名称或标签为none的镜像
docker rmi -f `docker images | grep '<none>' | awk '{print $3}'`
5)清除所有无容器使用的镜像
docker system prune -a
6)查找大文件
find / -type f -size +100M -print0 | xargs -0 du -h | sort -nr
7)查找指定docker使用目录下大于指定大小文件
find / -type f -size +100M -print0 | xargs -0 du -h | sort -nr |grep '/var/lib/docker/overlay2/*'
四、docker部署springboot项目
1.dockerfile指令详解
提供一个Dockerfile例子
# 基础镜像为centos
FROM centos:7
# 维护者
MAINTAINER ALEX
# 添加jdk压缩包至 /usr/local 目录,压缩包会自动解压,解压后目录名称为jdk1.8.0_271
ADD jdk-8u201-linux-x64.tar.gz /usr/local/env/jdk/
# 配置JAVA_HOME环境变量
ENV JAVA_HOME /usr/local/env/jdk/jdk1.8.0_201/
# 将JAVA_HOME/bin 添加至PATH环境变量
ENV PATH $JAVA_HOME/bin:$PATH
# 安装vim
RUN yum -y install vim
# 安装ll
RUN echo "alias ll='ls $LS_OPTIONS -l'" >> ~/.bashrc
RUN source ~/.bashrc
FROM jdk:1.8
MAINTAINER zkaw-mes-team
ENV TZ=Asia/Shanghai
ENV JAVA_OPTS="-Xms128m -Xmx512m -XX:-UseGCOverheadLimit -Djava.security.egd=file:/dev/./urandom -Dfile.encoding=utf-8"
ENV VERSION="1.0.1"
RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
ADD mes-modules-material-$VERSION.jar /home/docker/mes-modules-material-$VERSION.jar
CMD sleep 120;java $JAVA_OPTS -jar /home/docker/mes-modules-material-$VERSION.jar
2.编写Dockerfile文件
Dockerfile文件位置要与jar文件所在目录相同
FROM jdk:1.8
ENV TZ=Asia/Shanghai
#将本地文件添加到容器中,并更名为myproject.jar
ADD lxj-test-0.0.1-SNAPSHOT.jar /home/docker/lxj-test-0.0.1-SNAPSHOT.jar
VOLUME /home/docker/logs
RUN ["chmod","+x","/home/docker/lxj-test-0.0.1-SNAPSHOT.jar"]
ENTRYPOINT ["java","-jar","-Xmx1024m","-Xms1024m","-Dfile.encoding=utf-8","/home/docker/lxj-test-0.0.1-SNAPSHOT.jar",">>","/home/docker/logs/test.log","2>&1","&"]
《在Linux上我们使用nohup命令来后台运行文件》
nohup java -jar /mes-system.jar >> /usr/local/app/logs/system.log 2>&1 &
1).nohup意思就是使用后台方式运行java命令。
2).>/dev/null意思是将标准信息输出到一个黑洞(/dev/null),说人话就是不输出标准信息。
3).java -jar /mes-system.jar >> /usr/local/app/logs/system.log 将日志的内容打印到/usr/local/app/logs/system.log中
4).2>&1 意思是将标准错误2重定向到标准输出&1,标准输出再定向到/usr/local/app/logs/system.log
5).& 符号是后台启动的意思
3.制作docker镜像
在dockerfile所在文件夹执行如下命令
docker build -t lxjtest .
注意后面的点(.)表示Dockerfile文件所在的位置,点代表在当前位置。
4.运行镜像
并设置 映射路径及端口
docker run -d -it -p 8088:8088 -v /home/docker/lxj-test-0.0.1-SNAPSHOT.jar:/home/docker/lxj-test-0.0.1-SNAPSHOT.jar -v /home/docker/logs:/logs/ -v /etc/localtime:/etc/localtime --name lxj-test lxjtest
-v /home/docker/lxj-test-0.0.1-SNAPSHOT.jar:/home/docker/lxj-test-0.0.1-SNAPSHOT.jar挂载jar包,当jar包有更新时,将jar包放入主机的指定位置,重启docker容器就即可。
--net=host 设置容器和宿主机共享IP
--restart=always 表示开机自启动
如果docker run 的时候没有加 --restart=always ,然后已经运行的docker容器怎么设置自动重启? 执行下面命令:
docker update –-restart=always 容器名称
查询时间段内计划日志
docker logs -t -n 8 --since="2022-08-02T13:23:37" --until="2022-08-02T22:23:37" <容器名称>
5.docker打包流程
1)将容器变为镜像
docker commit 261314c94305 imagexxx
可用参数
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停。
imagexxx 是新创建的镜像的名字
2)将镜像打包成tar包
docker save -o xxx.tar imagexxx # 当前路径下会生成一个xxx.tar
例如:
docker save -o electric_know_1.31_0.tar electric_know_1.31_0:latest
3)将tar包生成镜像
docker load < xxx.tar # 生成的镜像跟之前打包的镜像名称一样
4)将镜像生成容器
docker run -it --name 容器名称 镜像名称 /bin.bash
五、docker容器设置时区
1、在Dockerfile中设置镜像时区
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
2、创建容器时设置时区
将宿主机与容器的时间进行挂载
-v /etc/localtime:/etc/localtime
3、进入容器进行设置
1)进入容器内:
docker exec -it 容器名 /bin/bash
2)设定时区
rm /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
六、设置Docker容器日志大小
1 设置一个容器服务的日志大小上限
通过配置容器docker-compose.yml的max-size选项来实现:
nginx:
image: nginx:1.12.1
restart: always
logging:
driver: "json-file"
options:
max-size: "5g"
或者
docker run或dokcer create时添加参数
如创建并运行
docker run --log-opt max-size=10m --log-opt max-file=3
2 全局设置
新建/etc/docker/daemon.json,若有就不用新建了
{
"storage-driver": "devicemapper",
"registry-mirrors": ["http://f613ce8f.m.daocloud.io"],
"log-driver":"json-file",
"log-opts": {"max-size":"500m", "max-file":"3"}
}
max-size=500m,意味着一个容器日志大小上限是500M,
max-file=3,意味着一个容器有三个日志,分别是id+.json、id+1.json、id+2.json
注:设置后只对新添加的容器有效。
除了 json-file 还支持很多 logging driver
none:容器没有日志可用,docker logs 什么都不返回 none 是 disable 容器日志功能
重启docker守护进程
systemctl daemon-reload
systemctl restart docker
3 docker日志存放位置
/var/lib/docker/containers
七、docker网络模式
常用命令:
# 创建网络
docker network create <Network Name>
# 查看已存在的网络
docker network list
#删除Docker网络
docker network rm xxx
八、Linux自动清除缓存脚本,亲测有效
1、cleanCache.sh 清除缓存脚本
#!/bin/bash
#description: 清除缓存
echo "开始清除缓存"
sync;sync;sync #写入硬盘,防止数据丢失
#sleep 10 #延迟10秒
echo 3 > /proc/sys/vm/drop_caches
echo "结束清除缓存"
#需要单独执行下面定时命令(每天凌晨一点执行)
#echo '0 1 * * * sh /opt/script/cron/cleanCache.sh' >> /var/spool/cron/root
2、root账户下执行 命令
echo '0 1 * * * sh /opt/script/cron/cleanCache.sh' >> /var/spool/cron/root
3、查看定时任务是否有效命令
crontab -l
4、删除所有定时任务命令
crontab -r
查看内存占用情况
1、free -h 详解
total: 内存总数
used: 已经使用内存数
free: 完全空闲内存
shared: 多个进程共享的内存
buffers: 用于块设备数据缓冲,记录文件系统metadata(目录,权限,属性等)
cached: 用于文件内容的缓冲
available:真正剩余的可被程序应用的内存数
2、查询CPU占用前十名
ps auxw|head -1;ps -auxf|sort -nr -k3|head -10
3、查询内存占用前十名
ps auxw|head -1;ps -auxf|sort -nr -k4|head -10
df -h 查询内存 查看磁盘空间大小
查看docker占用的情况
docker system df
du -sh * 查找到大小异常的文件
九、Linux系统中如何修改时间和时区
1.只设置时间
(1)先查看日期、时间和时区,通过date命令
date
(2)如果日期和时区都正确,则只更改时间,通过 date -s 时间
date -s 10:10
2.设置日期
如果需要设置日期,需要使用date -s设置
date -s yyyy-MM-dd
3.设置时区
设置时区可能稍微复杂点,它分为两步
(1)首先需要知道需要使用哪种时区,
例如,我国使用的北京时间,对应的时区为东八区,可以记为CST、GMT+8、Asia/Shanghai
(2)将系统中存储的时区信息,覆盖到本地时区配置
只需要将/usr/share/zoneinfo/下面的时区配置信息,覆盖到/etc/localtime本地时区配置即可,具体操作
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime