Docker 安装 和 使用

一、docker安装

docker是管理容器的引擎

官网:https://www.docker.com/

中文手册: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进程

image

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、官网镜像地址

https://hub.docker.com/search?q=&type=image&image_filter=official&operating_system=linux&architecture=amd64

每个镜像里面也有教程,自己看看吧

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

image-20220801200055828

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,指定一个环境变量,会被后续run指令使用,并在容器运行时保持;

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

image

修改一下

[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


posted @ 2023-01-31 14:11  雁书几封  阅读(310)  评论(0编辑  收藏  举报