docker基础之实用技能

Posted ShuSheng007

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker基础之实用技能相关的知识,希望对你有一定的参考价值。

[版权申明] 非商业目的注明出处可自由转载
出自:shusheng007

文章目录

概述

you know,记录docker实用技巧…

技巧

1. 如何以root用户运行docker容器

docker exec -u 0 -it 容器Id /bin/bash

2. 如何批量删除docker容器

有时废弃的容器特别多,一个一个删除有点废人…

  • 停止所有符合条件的容器
docker stop $(docker ps -a | grep 过滤条件 | awk 'print $1')

其中awk 'print $1' 表示获取容器Id,因为使用docker ps -a 查看容器详情后,第一列就是容器Id,所以是$1

  • 删除所有符合条件的容器
docker rm $(docker ps -a | grep 过滤条件 | awk 'print $1')

3.如何批量删除docker镜像

docker rmi $(docker images | grep 过滤条件 | awk 'print $3')

其中awk 'print $3' 表示获取镜像Id,因为使用docker images 查看镜像详情后,第3列是镜像Id,所以是$3

4.如何将docker镜像保存到离线文件

身处互联网行业的我以为互联网无处不在,直到我遇到了政府以及企事业单位才知道我大错特错了…

需求:离线安装docker镜像

  1. 生成镜像,这里省略20字。使用下面命令查看镜像
docker images
  1. 保存镜像到tar文件
docker save -o 目标文件.tar  镜像名:tag

-o 不能少,表示保存到文件

执行命令后在你的执行路径下就会生成一个目标文件.tar文件。

扩展:

save 命令可以将一个或者多个镜像打包成一个tar文件。可以使用docker save --help查看保存命令详情

docker save [OPTIONS] IMAGE [IMAGE...]
Save one or more images to a tar archive (streamed to STDOUT by default)

Options:
  -o, --output string   Write to a file, instead of STDOUT

5.如何从离线文件载入docker镜像

有时我们在无网络的环境下需要通过离线docker镜像包来运行镜像,这就要使用到load命令

docker load --input 镜像离线包.tar

镜像离线包.tar的路径下执行即可。

扩展

使用docker load --help查看加载命令详情

Usage:  docker load [OPTIONS]

Load an image from a tar archive or STDIN

Options:
  -i, --input string   Read from tar archive file, instead of STDIN
  -q, --quiet          Suppress the load output

6.如何查看docker容器日志

使用如下命令

docker logs 容器ID或者名称

它有很多参数可以加,我们可以使用--help命令查看

Usage:  docker logs [OPTIONS] CONTAINER

Fetch the logs of a container

Options:
      --details        Show extra details provided to logs
  -f, --follow         Follow log output
      --since string   Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)
  -n, --tail string    Number of lines to show from the end of the logs (default "all")
  -t, --timestamps     Show timestamps
      --until string   Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)

例如下面的命令表示以跟踪模式(个人理解为持续监视日志。当有输出时,这边就开始显示,要使用control+c才能结束)显示30行日志

docker logs --follow --tail 30 容器名称或ID

7.在docker容器无法启动的情况下,如何删除其中的文件

由于误操作,在容器中加了一个文件,导致容器无法启动,那样就无法进入容器内删除此文件,无法删除文件就无法启动容器…我R,进入了死循环!

  1. 进入docker的目录
cd  /var/lib/docker/overlay2/
  1. 使用命令查找你要删除的文件
find ./ -name 你的文件名

输出:

./21e881xxxxxxb2b18b196d88be02c29e60d5f0/diff/usr/share/elasticsearch/plugins/你的文件名
  1. 删除此文件
rm ./21e881xxxxxxb2b18b196d88be02c29e60d5f0/diff/usr/share/elasticsearch/plugins/你的文件名

重启容器,成功!

8.如何解决dokcer容器中无法使用vi/vim的问题

docker镜像默认未安装vi/vim编辑器,如果要在docker容器中编辑文件需要我们手动安装。

进入docker容器内,依次执行如下命令

  1. 更新安装包
apt-get update
  1. 安装vim
apt-get install vim

9. 如何解决docker安装vi/vim后中文乱码的问题

我们在docker容器中安装了vi/vim后,打开一个含有中文的文件,中文竟然是乱码,这可如何是好?莫慌,执行如下命令后重启容器即可

cat << EOF >> /root/.vimrc
> :set encoding=utf-8
> :set fileencodings=ucs-bom,utf-8,cp936
> :set fileencoding=gb2312
> :set termencoding=utf-8
> EOF

上面的命令表示在/root/.vimrc文件后面追加编码信息。 特别要注意第一行的EOF>> 其中>>表示追加,>表示覆盖。

10. 如何解决mysql命令行(CLI)中文乱码问题

这个主要是由于mysql的命令行客户端默认不支持中文,我们可以使用如下命令检查数据库编码信息:

show variables like "%character%";

我在Navicat中执行上面的语句得到如下结果,所以使用Navicat导入sql中文不乱码

而在mariadb docker容器中使用CLI执行如下查询语句

MariaDB [(none)]> show  variables like "%character%";

输出:


+--------------------------+----------------------------+
| Variable_name                 | Value                      |
+--------------------------+----------------------------+
| character_set_client          | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | utf8mb4                    |
| character_set_filesystem   | binary                     |
| character_set_results        | latin1                     |
| character_set_server         | utf8mb4                    |
| character_set_system       | utf8mb3                    |
| character_sets_dir             | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

可以看到character_set_client与character_set_connection 都是latin1,不支持中文。所以我们的修改其值。

我们可以通过修改数据库的配置文件来修改上述编码方式。

mysql容器的配置文件路径为

/etc/mysql
root@2da3bf02cf51:/# cd /etc/mysql
root@2da3bf02cf51:/etc/mysql# ll

输出:
drwxr-xr-x 1 root root 4096 Apr 17 14:00 ./
drwxr-xr-x 1 root root 4096 Apr 17 13:09 ../
drwxr-xr-x 2 root root 4096 Nov  5 20:07 conf.d/
-rwxr-xr-x 1 root root 1731 Nov  5 20:03 debian-start*
-rw------- 1 root root  546 Feb  2 03:46 debian.cnf
-rw-r--r-- 1 root root 1400 Apr 17 14:00 mariadb.cnf
drwxr-xr-x 3 root root 4096 Feb  2 03:46 mariadb.conf.d/
lrwxrwxrwx 1 root root   24 Feb  2 03:46 my.cnf -> /etc/alternatives/my.cnf

这么多文件我们改哪个呢?基本上来说,改那个都行,我们就改mariadb.cnf吧。

vim mariadb.cnf

打开文件后,你会看到一段注释,告诉你那些配置文件是怎么起作用的

# The MariaDB/MySQL tools read configuration files in the following order:
# 0. "/etc/mysql/my.cnf" symlinks to this file, reason why all the rest is read.
# 1. "/etc/mysql/mariadb.cnf" (this file) to set global defaults,
# 2. "/etc/mysql/conf.d/*.cnf" to set global options.
# 3. "/etc/mysql/mariadb.conf.d/*.cnf" to set MariaDB-only options.
# 4. "~/.my.cnf" to set user-specific options.

废话不多说了了,在mariadb.cnf中追加如下配置重后启即可

[client]
# Default is Latin1, if you need UTF-8 set this (also in server section)
default-character-set = utf8

[mysqld]
# Default is Latin1, if you need UTF-8 set all this (also in client section)
character-set-server  = utf8

重启mysql容器

docker restart  容器id

再次查看编码

MariaDB [(none)]> show variables like "%character%";

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

验证看看吧

11.如何在不进入docker容器内部的情况下执行sql文件

docker exec -i mysql容器ID mysql -h容器Ip  -u用户名 -p密码 --default-character-set=utf8 你的数据库 < 数据文件.sql

12.如何在mysql docker容器中批量执行sql文件

有时sql文件非常多,而我们平时使用的Navicat工具却不支持批量导入sql,所以我们就需要一种批量执行的方法。这里介绍两种方法:

假设有如下文件

data_sql
├── batch_insert.sql
└── data
    ├── student1.sql
    └── student2.sql   

其中student1.sqlstudent2.sql是两个插入数据的sql文件,batch_insert.sql就是我们建立的一个批量执行文件,内容为:

source ./data/student1.sql;
source ./data/student2.sql;

第一步: 拷贝文件到docker中的/tmp文件夹中

docker cp /你本地的文件路径/data_sql mysql容器ID:/tmp/

第二步: 进入mysql容器内

docker exec -u 0 -it 容器ID /bin/bash

第三步:进入batch_insert.sql文件所在的目录。

cd /tmp/data_sql

这一步很关键,不然无法导入

第四步: 使用CLI客户端连接mysql

mysql -u数据库用户名 -p数据库密码

第五步 选择要导入的数据库

use 数据库名称

第六步:保存sql执行日志(可选)

tee /tmp/sql.log

第七步:批量执行sql

source /tmp/data_sql/batch_insert.sql

13.如何将docker容器加入已经存在的网络

背景:已经存几个docker运行的服务,他们都使用一个自定义的docker网络,然后有一个新服务需要也需要加入这个网络,这样才能互相访问。

  • 先启动我们的服务,例如myService

通过docker run,或者docker-compose启动

  • 手动加入已经存在的网络mynetwork,ip由网络自动分派
docker network connect mynetwork myService

14.如何在docker-compose文件中将服务加入已经存在的网络

背景:已经存几个docker运行的服务,他们都使用同一个自定义的docker网络mynetwork,并设置了固定ip。现在使用docker-compose启动一个服务myService并使其加入此网络,并分派ip。

  • 定义网络

在与services平级的位置声明网络配置,如下所示

networks:
  mynetwork:
    external: true

mynetwork是已经存在的网络,下面的external:true指明它是已经存在的外部网络

  • 在服务中配置刚才定义的网络
    networks:
      mynetwork: 
         ipv4_address: 172.172.0.14

上面配置了固定ip,如果不需要则直接申明使用网络即可

    networks:
       - mynetwork

完整配置如下所示:

version: '3'
services:
  myService:
    restart: always
    image: myService:1.0.0
    container_name: myService
    ports:
      - 8289:8289
    environment:
      - SERVER_PORT=8289
	 ...
    networks:
      mynetwork: 
         ipv4_address: 172.172.0.14

networks:
  mynetwork:
    external: true

导航到docker-compose文件路径下,直接使用下面命令启动即可

docker-compose -f 你的docker-compose.yml up -d

-d 表示使用detach模式启动,可以理解为后台启动

15. 如何在docker-compose文件中创建网络并指定ip

version: '3'
services:
  myService:
    restart: always
    image: myService:1.0.0
    container_name: myService
    ports:
      - 8289:8289
    environment:
      - SERVER_PORT=8289
	 ...
    networks:
      mynetwork: 
         ipv4_address: 172.172.0.1

networks:
  mynetwork:
  	driver: bridge
    ipam: 
      config
        - subnet: 	172.172.0.0/24

其中172.172.0.0/24 后面的24是子网掩码,这块又能讲老大一堆。

总结

持续更新中…

积跬步,至千里…常点赞,运气好…

以上是关于docker基础之实用技能的主要内容,如果未能解决你的问题,请参考以下文章

Docker实用技能

云原生时代必须具备的核心技能之Docker高级篇(Docker网络详解)

云原生时代必须具备的核心技能之Docker高级篇(Docker实战之SpringBoot项目部署)

delphi 面向对象实用技能教学二(封装)

Docker基础 文件系统之AUFS

php生产实用技能之计划任务(视频讲解)