docker基础之实用技能
Posted ShuSheng007
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker基础之实用技能相关的知识,希望对你有一定的参考价值。
[版权申明] 非商业目的注明出处可自由转载
出自:shusheng007
文章目录
- 概述
- 技巧
- 1. 如何以root用户运行docker容器
- 2. 如何批量删除docker容器
- 3.如何批量删除docker镜像
- 4.如何将docker镜像保存到离线文件
- 5.如何从离线文件载入docker镜像
- 6.如何查看docker容器日志
- 7.在docker容器无法启动的情况下,如何删除其中的文件
- 8.如何解决dokcer容器中无法使用vi/vim的问题
- 9. 如何解决docker安装vi/vim后中文乱码的问题
- 10. 如何解决Mysql命令行(CLI)中文乱码问题
- 11.如何在不进入docker容器内部的情况下执行sql文件
- 12.如何在mysql docker容器中批量执行sql文件
- 13.如何将docker容器加入已经存在的网络
- 14.如何在docker-compose文件中将服务加入已经存在的网络
- 15. 如何在docker-compose文件中创建网络并指定ip
- 总结
概述
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镜像
- 生成镜像,这里省略20字。使用下面命令查看镜像
docker images
- 保存镜像到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,进入了死循环!
- 进入docker的目录
cd /var/lib/docker/overlay2/
- 使用命令查找你要删除的文件
find ./ -name 你的文件名
输出:
./21e881xxxxxxb2b18b196d88be02c29e60d5f0/diff/usr/share/elasticsearch/plugins/你的文件名
- 删除此文件
rm ./21e881xxxxxxb2b18b196d88be02c29e60d5f0/diff/usr/share/elasticsearch/plugins/你的文件名
重启容器,成功!
8.如何解决dokcer容器中无法使用vi/vim的问题
docker镜像默认未安装vi/vim编辑器,如果要在docker容器中编辑文件需要我们手动安装。
进入docker容器内,依次执行如下命令
- 更新安装包
apt-get update
- 安装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.sql
与student2.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网络详解)