Docker本地镜像的导出导入

有时我们需要将一台电脑上的镜像复制到另一台电脑上使用,除了可以借助仓库外,还可以直接将镜像保存成一个文件,再拷贝到另一台电脑上导入使用。

对于镜像的导出和导入,Docker 提供了两种方案,下面分别进行介绍。

一、使用 export 和 import

1、查看本机的容器

这两个命令是通过容器来导入、导出镜像。首先我们使用 docker ps -a 命令查看本机所有的容器。

2、导出镜像

(1)使用 docker export 命令根据容器 ID 将镜像导出成一个文件。

1
docker export 容器id > xxx.tar

(2)上面命令执行后,可以看到文件已经保存到当前的 docker 终端目录下。

3、导入镜像

(1)使用 docker import 命令则可将这个镜像文件导入进来。

1
docker import - 镜像名称 < xxx.tar

(2)执行 docker images 命令可以看到镜像确实已经导入进来了。

二、使用 save 和 load

1、查看本机的容器

这两个命令是通过镜像来保存、加载镜像文件的。首先我们使用 docker images 命令查看本机所有的镜像。

2、保存镜像

(1)下面使用 docker save 命令根据 ID 将镜像保存成一个文件。

1
docker save 镜像id > xxx.tar

(2)我们还可以同时将多个 image 打包成一个文件,比如下面将镜像库中的 postgresmongo 打包:

1
docker save -o images.tar postgres:9.6 mongo:3.4

3、载入镜像

使用 docker load 命令则可将这个镜像文件载入进来。

1
docker load < xxx.tar

Docker load 之后镜像名字为none

这个问题的根本在于这个镜像压缩包在打包的时候操作不当所导致

例如,使用镜像ID打包的话导致解压的出来的镜像没有名字

1
docker save -o redis.tar 7864316753

因此,推荐使用镜像的名字进行打包,例如:

1
docker save -o redis.tar redis:5.0.2

此方式打包的镜像,解压出来就有镜像名称了

另外,附上重命名镜像的方法:

1
docker tag [镜像id] [新镜像名称]:[新镜像标签]

附:两种方案的差别

特别注意:两种方法不可混用。
如果使用 import 导入 save 产生的文件,虽然导入不提示错误,但是启动容器时会提示失败,会出现类似”docker: Error response from daemon: Container command not found or does not exist“的错误。

1、文件大小不同

export 导出的镜像文件体积小于 save 保存的镜像

2、是否可以对镜像重命名

  • docker import 可以为镜像指定新名称
  • docker load 不能对载入的镜像重命名

3、是否可以同时将多个镜像打包到一个文件中

  • docker export 不支持
  • docker save 支持

4、是否包含镜像历史

  • export 导出(import 导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史记录和元数据信息(即仅保存容器当时的快照状态),所以无法进行回滚操作。
  • save 保存(load 加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)。

5、应用场景不同

  • docker export 的应用场景:主要用来制作基础镜像,比如我们从一个 ubuntu 镜像启动一个容器,然后安装一些软件和进行一些设置后,使用 docker export 保存为一个基础镜像。然后,把这个镜像分发给其他人使用,比如作为基础的开发环境。
  • docker save 的应用场景:如果我们的应用是使用 docker-compose.yml 编排的多个镜像组合,但我们要部署的客户服务器并不能连外网。这时就可以使用 docker save 将用到的镜像打个包,然后拷贝到客户服务器上使用 docker load 载入。

CentOS7修改SSH端口和秘钥登录

修改ssh配置文件sshd_config

1
vim /etc/ssh/sshd_config

首先将原来 #Port=22 这行的#号去掉,另起一行同样键入 Port=8022 然后保存退出

防火墙放行

1
2
firewall-cmd --zone=public --add-port=8022/tcp --permanent
firewall-cmd --reload

重启 ssh 服务:

1
systemctl restart sshd.service

测试成功后,将原来的 22 端口注释掉即可(这里如果不行的话,检查 SELinux 设置、iptables 防火墙设置、firewalld 防火墙设置)

向SELinux中添加修改的SSH端口(修改成功可跳过)

先安装SELinux的管理工具 semanage (如果已经安装了就直接到下一步) :

1
yum provides semanage

安装运行semanage所需依赖工具包 policycoreutils-python:

1
yum -y install policycoreutils-python

查询当前 ssh 服务端口:

1
semanage port -l | grep ssh

向 SELinux 中添加 ssh 端口:

1
semanage port -a -t ssh_port_t -p tcp 8022

使用 Xshell 秘钥登录

首先需要在被连接的Linux服务器上修改 /etc/ssh/sshd_config 配置文件中的参数,修改完以后,先不要重启 sshd 服务

1
2
3
PasswordAuthentication no        # 不允许密码验证登录
PubkeyAuthentication yes # 允许公钥验证登录
AuthorizedKeysFile .ssh/authorized_keys # 指定公钥文件路径

在 Xshell 端口生成一对秘钥,将公钥复制粘贴到 Linux 服务器的中 /root/.ssh/authorized_keys 文件

1
vim /root/.ssh/authorized_keys

上图中在下拉框中已经看到了公钥,然后全选复制,最后将粘贴到Linux服务器的 /root/.ssh/authorized_keys 文件中

然后给这个文件修改权限为 600(如果 /root/.ssh/ 下没有 authorized_keys 文件,可以手动创建一个)

1
chmod 600  /root/.ssh/authorized_keys

最后,重点是所有设置都完成以后,记得要重启sshd服务

1
systemctl  restart sshd

登录测试

CentOS7安装frps配置自启动

1和2二选一

1、脚本安装frps

1
2
3
4
cd /tmp
wget --no-check-certificate https://raw.githubusercontent.com/clangcn/onekey-install-shell/master/frps/install-frps.sh -O ./install-frps.sh
chmod 777 install-frps.sh
./install-frps.sh install

2、程序包安装

(1)下载frp程序文件

1
https://github.com/fatedier/frp/releases

(2)解压文件

下载后解压到自己的目录,我这里解压到/usr/local/frp:

(3)添加systemd配置文件:

1
vim /etc/systemd/system/frps.service

文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[Unit]

Description=FRP Server Daemon

[Service]

Type=simple

ExecStartPre=-/sbin/setcap cap_net_bind_service=+ep /usr/local/frp/frps

ExecStart=/usr/local/frp/frps -c /usr/local/frp/frps.ini

Restart=always

RestartSec=20s

User=nobody

PermissionsStartOnly=true

[Install]

WantedBy=multi-user.target

ExecStart的内容请根据自己frp安装目录修改。

(4)设置开机启动

1
2
systemctl daemon-reload
systemctl enable frp

(5)启动 frp

1
systemctl start frp

(6)查看frp是否启动

1
ps aux | grep frp

看到这里就说明启动成功了。

docker-compose常用命令

命令 含义
docker-compose up -d nginx 构建建启动nignx容器
docker-compose exec nginx bash 登录到nginx容器中
docker-compose down 删除所有nginx容器,镜像
docker-compose ps 显示所有容器
docker-compose restart nginx 重新启动nginx容器
docker-compose run –no-deps –rm php-fpm php -v 在php-fpm中不启动关联容器,并容器执行php -v 执行完成后删除容器
docker-compose build nginx 构建镜像
docker-compose build –no-cache nginx 不带缓存的构建
docker-compose logs nginx 查看nginx的日志
docker-compose logs -f nginx 查看nginx的实时日志
docker-compose config -q 验证(docker-compose.yml)文件配置,当配置正确时,不输出任何内容,当文件配置错误,输出错误信息
docker-compose events –json nginx 以json的形式输出nginx的docker日志
docker-compose pause nginx 暂停nignx容器
docker-compose unpause nginx 恢复ningx容器
docker-compose rm nginx 删除容器(删除前必须关闭容器)
docker-compose stop nginx 停止nignx容器
docker-compose start nginx 启动nignx容器

CentOS7安装Docker

安装需要的软件包, yum-util 提供 yum-config-manager 功能,另外两个是 devicemapper 驱动依赖的

1
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

设置 yum 源

1
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

可以查看所有仓库中所有 docker 版本,并选择特定版本安装

1
yum list docker-ce --showduplicates | sort -r

1
sudo yum install <版本号>

启动并加入开机启动

1
2
sudo systemctl start docker
sudo systemctl enable docker

验证安装是否成功

1
sudo docker version

CentOS7安装docker-compose

centos 7中python-pip模块不存在,是因为像centos这类衍生的发行版,源跟新滞后,或者不存在。即使使用yum去search python-pip也找不到软件包。

为了使用安装滞后或源中不存在的安装包,需要安装扩展源EPEL。扩展源EPEL(http://fedoraproject.org/wiki/EPEL) 是由 Fedora 社区打造,为 RHEL 及衍生发行版如 CentOS、Scientific Linux 等提供高质量软件包的项目。

安装扩展源

1
yum -y install epel-release

安装python-pip模块

1
yum install python-pip

此时执行 docker-compose version 命令可能会出现命令不存在的问题,需要进行安装

1
2
3
4
5
6
7
cd /usr/local/bin/

wget https://github.com/docker/compose/releases/download/1.14.0-rc2/docker-compose-Linux-x86_64

rename docker-compose-Linux-x86_64 docker-compose docker-compose-Linux-x86_64

chmod +x /usr/local/bin/docker-compose

tar常用命令

参数含义

  • -c:创建新的存档文件(Create)
  • -x:从存档文件中提取文件(eXtract)
  • -t:列出存档文件中的内容(lisT)
  • -v:显示 tar 命令执行的详细信息(Verbose)
  • -f:指定存档文件的名称(File)
  • -z:在创建或提取存档文件时使用 gzip 压缩算法来进行压缩或解压缩(gzip)
  • -j:在创建或提取存档文件时使用 bzip2 压缩算法来进行压缩或解压缩(bzip2)
  • -C:指定 tar 命令的工作目录(Change directory)

常用命令

算法 参数 压缩 解压 特点
N/A tar -cvf archive.tar directory/ tar -xvf archive.tar N/A
gzip -z tar -czvf archive.tar.gz directory/ tar -xzvf archive.tar.gz gzip 是 GNU 压缩程序,它是基于 DEFLATE 算法的一种压缩方式,压缩速度快,压缩率较高
bzip2 -j tar -cjvf archive.tar.bz2 directory/ tar -xjvf archive.tar.bz2 bzip2 使用 Burrows-Wheeler 算法,压缩率比 gzip 高,但压缩速度较慢
LZMA/LZMA2 -J tar -cJvf archive.tar.xz directory/ tar -xJvf archive.tar.xz xz 使用 LZMA/LZMA2 算法,提供更高的压缩率,但压缩和解压缩速度相对较慢
compress -Z tar -cZvf archive.tar.Z directory/ tar -xZvf archive.tar.Z compress 是早期的 UNIX 压缩工具,基于 LZW 算法,压缩率和速度都较低,现已很少使用
lzip –lzip tar –lzip -cvf archive.tar.lz directory/ tar –lzip -xvf archive.tar.lz lzip 使用 LZMA 算法,提供高压缩率,压缩和解压速度较慢
lzop –lzop tar –lzop -cvf archive.tar.lzo directory/ tar –lzop -xvf archive.tar.lzo lzop 基于 LZO 算法,压缩速度非常快,但压缩率较低
zstd –zstd tar –zstd -cvf archive.tar.zst directory/ tar –zstd -xvf archive.tar.zst zstd 是由 Facebook 开发的一种压缩算法,提供高压缩率和快速的压缩/解压速度

CentOS7密码错误设置锁定账号

1、限制用户远程登录

在#%PAM-1.0的下面,即第二行,添加内容,一定要写在前面,如果写在后面,虽然用户被锁定,但是只要用户输入正确的密码,还是可以登录的!

1
vim /etc/pam.d/sshd
1
2
3
#%PAM-1.0  

auth required pam_tally2.so deny=3 unlock_time=300 even_deny_root root_unlock_time=10

参数解释

even_deny_root 也限制root用户;

deny 设置普通用户和root用户连续错误登陆的最大次数,超过最大次数,则锁定该用户;

unlock_time 设定普通用户锁定后,多少时间后解锁,单位是秒;

root_unlock_time 设定root用户锁定后,多少时间后解锁,单位是秒;

此处使用的是 pam_tally2 模块,如果不支持 pam_tally2 可以使用 pam_tally 模块。另外,不同的pam版本,设置可能有所不同,具体使用方法,可以参照相关模块的使用规则。

2、限制用户从tty登录

在#%PAM-1.0的下面,即第二行,添加内容,一定要写在前面,如果写在后面,虽然用户被锁定,但是只要用户输入正确的密码,还是可以登录的!

1
vim /etc/pam.d/login
1
2
3
#%PAM-1.0  

auth required pam_tally2.so deny=3 lock_time=300 even_deny_root root_unlock_time=10

同样是增加在第2行!

3、查看用户登录失败次数

1
2
cd /etc/pam.d/
pam_tally2 --user root

4、解锁指定用户

1
pam_tally2 -r -u root

CentOS7开放及查看端口

1、开放端口

1
2
3
4
5
firewall-cmd --zone=public --add-port=5672/tcp --permanent   # 开放5672端口

firewall-cmd --zone=public --remove-port=5672/tcp --permanent #关闭5672端口

firewall-cmd --reload # 配置立即生效

2、查看防火墙所有开放的端口

1
firewall-cmd --zone=public --list-ports

3、关闭防火墙

1
systemctl stop firewalld.service

4、查看防火墙状态

1
firewall-cmd --state

5、查看监听的端口

1
netstat -lnpt

6、检查端口被哪个进程占用

1
netstat -lnpt |grep 5672

7、查看进程的详细信息

1
ps 6832

8、中止进程

1
kill -9 6832

CentOS7禁止ping

一、临时生效

1、允许ping

1
echo 0 >/proc/sys/net/ipv4/icmp_echo_ignore_all 

2、禁止ping

1
echo 1 >/proc/sys/net/ipv4/icmp_echo_ignore_all 

二、永久生效

修改文件:/etc/sysctl.conf

1、允许ping

增加一行:

1
2
vim /etc/sysctl.conf
net.ipv4.icmp_echo_ignore_all=0

2、禁止ping

增加一行:

1
2
vim /etc/sysctl.conf
net.ipv4.icmp_echo_ignore_all=1

修改后使用以下命令使之生效:

1
sysctl -p