一、基础环境

1、操作系统:CentOS 7.6

2、Docker版本:https://download.docker.com/linux/static/stable/x86_64/docker-19.03.9.tgz

3、官方参考文档:https://docs.docker.com/install/linux/docker-ce/binaries/#install-static-binaries

 

二、Docker安装

1、下载

wget https://download.docker.com/linux/static/stable/x86_64/docker-19.03.8.tgz

2、解压

tar zxvf docker-19.03.8.tgz

3、将解压出来的docker文件内容移动到 /usr/bin/ 目录下

cp /docker/* /usr/bin/

#我在第一次操作的时候,将整个docker文件夹及目录下的文件移动到了 /usr/bin 下导致启动失败,需要注意,只要docker下的文件。。。

4、将docker注册为service

vi /etc/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
# 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
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

 

5、启动

chmod +x /etc/systemd/system/docker.service #添加文件权限并启动docker

systemctl daemon-reload                 #重新加载配置文件

systemctl start docker          #启动Docker

systemctl enable docker.service         #设置开机自启

 

6、验证

systemctl status docker         #查看Docker状态

docker -v           #查看Docker版本

 

7、重启系统。查看docker是否已经启动。

 

三、镜像的导出

1、查看服务器上下载的镜像

# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 6678c7c2e56c 4 days ago 127MB
mariadb 10.4.12 a90e8f717676 2 weeks ago 356MB
tomcat 8.5.50 b56d8850aed5 4weeks ago 529MB
redis 3.2 87856cc39862 16months ago 76MB

 

2、导出相关镜像

docker save -o /home/mariadb10.4.12.tar.gz mariadb:10.4.12

说明: -o :输出到的文件 /home/mariadb10.4.12.tar.gz输出的路径及文件名。 mariadb:10.4.12:本地镜像仓库:TAG

执行完成后,将该文件上传到你要恢复镜像的服务器。

3、在恢复镜像的服务器进行导入

 

docker load < /home/mariadb10.4.12.tar.gz

docker load < /home/mariadb10.4.12.tar.gz

cc4590d6a718: Loading layer [======================>] 65.58MB/65.58MB 8c98131d2d1d: Loading layer

…………………………………………………………………………………………………………………………………………

28cf79891799: Loading layer [=================================>] 1.536kB/1.536kB

Loaded image: mariadb:10.4.12

查看导出的镜像

docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

mariadb 10.4.12 a90e8f717676 2 weeks ago 356MB

4、利用恢复的镜像创建容器。

①新建一个临时容器

docker run -it -d --name mysqltest -v /docker/mysql:/var/lib/mysql -v /docker/mysql/logs:/var/log/mysql --restart=always -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 mariadb:10.4.12

然后进入容器

docker exec -it mysqltest bash

tar zcvf /var/lib/mysql/my.cnf.tar.gz /etc/mysql/*

在容器内打包 /etc/mysql/* 到 /var/lib/mysql/my.cnf.tar.gz

②拷贝刚才打包的文件。

退出容器,cp /docker/mysql/my.cnf.tar.gz /docker/mysql/conf

#因为我们在第①步已经将容器内/var/lib/mysql映射到宿主机上的/docker/mysql目录,所以刚才在容器的打包的配置文件在 /docker/mysql目录内就存在了。

 

③ chmod 755 /docker/mysql/conf

④ 解压my.cnf.tar.gz

/docker/mysql/conf/tar zxvf my.cnf.tar.gz

⑤停止和删除刚才建立的临时容器

docker stop mysqltest #停止这个容器服务

docker rm mysqltest #删除这个容器

 

⑥创建容器

 

docker run -it -d --name mysql -v /docker/mysql/data:/var/lib/mysql -v /docker/mysql/conf/:/etc/mysql/conf.d -v /docker/mysql/logs:/var/log/mysql --restart=always -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 mariadb:10.4.12

 

#注意这个地方

/docker/mysql/conf/:/etc/mysql/conf.d

之所以要将conf文件夹映射到/etc/mysql/conf.d下,是因为官方文档说:将含有.cnf文件结尾的文件夹映射到这个文件夹下后,在启动MySQL容器的时候,会自动使用我们的配置文件来替换原来的。文档地址:https://hub.docker.com/_/mariadb

 

查看刚才的容器。

 

docker ps

 

为了进行验证/docker/mysq/conf/my.cnf是否启动了配置作用。

可以将my.cnf配置进行相关的修改。我在测试的时候将port端口由默认3306修改为了3309

然后新建一个容器

 

docker run -it -d --name mysql -v /docker/mysql/data:/var/lib/mysql -v /docker/mysql/conf/:/etc/mysql/conf.d -v /docker/mysql/logs:/var/log/mysql --restart=always -p 3310:3309 -e MYSQL_ROOT_PASSWORD=123456 mariadb:10.4.12

然后用Navicat 进行连接测试。

或者是进入容器内部,查看端口是否启动是3309

 

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++

1、容器的导出镜像(启动容器后进行了相关更新,并以此为版本生成新的镜像)

docker commit 容器id 新镜像名称

docker commit 3f468ca79796 haproxy_keepalived:v1.1

 

2、根据刚才导出的新镜像生成新的容器

docker run -it -d -p 4001:8888 -p 4002:3306 -v /etc/haproxy:/usr/local/etc/haproxy --name h1 --privileged --net=net1 --ip 172.18.0.7 haproxy_keepalived:1.1

 

3、导出相关镜像并将该文件cp到其他机器

docker save -o /home/haproxy_keepalived:v1.1 haproxy_keepalived:v1.1

4、在恢复镜像的服务器进行导入

docker load < /home/haproxy_keepalived:v1.1

5、docker images 查看刚才导入的镜像

6、利用该镜像进行新的容器部署。

 

例如打印容器mytest应用后100行的内容。

 

docker logs --tail="300" 容器名称

 

查看指定时间后的日志,只显示最后100行:

$ docker logs -f -t --since="2018-02-08" --tail=100 CONTAINER_ID (容器id)

 

查看最近30分钟的日志:

docker logs --since 30m CONTAINER_ID

 

查看某时间段日志:

$ docker logs -t --since="2018-02-08T13:23:37" --until "2018-02-09T12:23:37" CONTAINER_ID