centos7离线安装docker
https://blog.csdn.net/liumiaocn/article/details/78349005
pull镜像
网易云镜像:https://c.163yun.com/hub#/m/home/
docker使用
1.运行
- 通过镜像方式启动,但每次都不会保存环境,并且会重新生成container
docker run -itd -p 8012:8012 -p 10022:22 -v /home/stfz/compareserver:/home/stfz/compareserver 82fdb0d63727
- docker run命令带--rm命令选项,等价于在容器退出后,执行docker rm -v
- 想在docker内部调试gdb解决办法就是create和run的时候带上--cap-add sys_ptrace
docker run -itd --cap-add sys_ptrace -p 10021:22 -p 8083:80 destop-ubuntu
ssh [email protected] -p 10022 //常用密码1
root@82fdb0d63727中82fdb0d63727为container id
- 启动容器
root@stfz-desktop:/home/stfz# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ac5ee2395c0b 0da2d5d21bf0 "/usr/bin/supervisord" 16 hours ago Exited (0) 16 minutes ago hungry_feynman
58ae15439a51 290532a393b4 "/usr/bin/supervisord" 17 hours ago Up 16 minutes 0.0.0.0:10022->22/tcp jolly_cray
50e81169b3d7 1196ea15dad6 "/usr/bin/supervisord" 3 days ago Exited (0) 3 days ago wizardly_visvesvaraya
51c9b85bbc08 1196ea15dad6 "/usr/bin/supervisord" 3 days ago Exited (139) 3 days ago sharp_lewin
e7d45646d5d3 1196ea15dad6 "/usr/bin/supervisord" 3 days ago Exited (0) 3 days ago affectionate_dijkstra
sudo docker start ac5ee2395c0b
- 进入容器
docker exec -it ac5ee2395c0b /bin/bash
-i: --interactive(相互作用的) Keep STDIN open even if not attached(即使没有连接,也要保持STDIN打开)
-t: --tty Allocate a pseudo-TTY(分配一个 冒充的终端设备)
/bin/bash:启动bash
2.删除
删除image
stfz@stfz-desktop:~$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ssh-ubuntu latest c3d84cb2121b 11 minutes ago 243 MB
ubuntu 16.04 5e8b97a2a082 30 hours ago 114 MB
b158a4f22808 2 weeks ago 113 MB
ubuntu 0b1edfbffd27 5 weeks ago 113 MB
daocloud.io/daocloud/tensorflow latest 414b6e39764a 3 months ago 1.27 GB
想要删除image b158a4f22808
stfz@stfz-desktop:~$ sudo docker rmi b158a4f22808
Error response from daemon: conflict: unable to delete b158a4f22808 (must be forced) - image is being used by stopped container c231431cf51b
如上提示镜像被容器c231431cf51b使用,提示你先删除容器
stfz@stfz-desktop:~$ sudo docker rm c231431cf51b
c231431cf51b
然后再删除image
stfz@stfz-desktop:~$ sudo docker rmi b158a4f22808
Deleted: sha256:b158a4f228085185f368baeb835f59b7e17ed19c04a0d30b726b1475755a7642
Deleted: sha256:89dbaf474a29ea90bac43021468c290b20f0cd165a89cea1c5612c4fee91780b
3.制作新的镜像
到此,我们需要把这个带有ssh服务的容器提交成一个镜像,方便以后在这个基础上各种改造:
docker commit
stfz@stfz-desktop:~$ sudo docker commit b670b2beaf8c ssh-ubuntu
image name不可以大写字母,否则出现:
invalid reference format: repository name must be lowercase
疑问
:每次想保存都需要commit一下吗?
解答
:不需要,利用docker start,而不是docker run
4.保存镜像
docker save 24aae4d0c04c > /home/stfz/compareserver-docker.tar ,然后把此归纳文件拷贝到任意你想要的地方(比如 u盘 移动硬盘 电脑等)
在需要还原docker image的主机执行:sudo docker load < compareserver-docker.tar (宿主机必须装有docker)
提示 Loaded image: compareserver-docker.ta 表示加载成功,我们就可以级继续使用这个docker 镜像啦
//用docker tag 重新命名
docker tag efeb4214cfc4 compareserverv1.0
5.查看日志
sudo docker logs -f 容器id
6.如何开机启动docker容器
宿主机重启后自动启动容器
可以执行如下命令设置--restart=always
,使得重启宿主机后,还会自动启动该容器。
前提有两个:
- 宿主机
system enable docker
。就是说:宿主机开机时,会自动启动docker
服务。 - 已经
docker start
了该container
。
// docker start
docker update --restart=always
同理,如果不想让这个容器随着宿主机重启而重启的话,则应该设置--restart=no
。
//docker start
docker update --restart=no
7.在Linux平台上运行Docker GUI程序
- docker容器里直接运行GUI程序
- 网页方式运行GUI程序
ubuntu docker 开启ssh
直接从网易蜂巢上下载已经装好各种工具的ubuntu镜像https://blog.csdn.net/qq_27068845/article/details/77015432
传输文件
示例命令:
docker cp 本地主机文件路径/或者文件夹 nginx容器id://usr/share/nginx/html
完整命令:
docker cp index.html 756a94bed476://usr/share/nginx/html
8. docker
Docker的网络模板有点类似我们平常使用虚拟机的host-only模式,容器和宿主机组成一个独立的局域网,宿主机的IP为172.17.0.1,对应主机的网络名称为docker0
root@inspiron-3670:~# ifconfig
docker0 Link encap:以太网 硬件地址 02:42:90:f0:8a:db
inet 地址:172.17.0.1 广播:172.17.255.255 掩码:255.255.0.0
inet6 地址: fe80::42:90ff:fef0:8adb/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1
接收数据包:146715 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:596336 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:0
接收字节:644721526 (644.7 MB) 发送字节:568274789 (568.2 MB)
enp2s0 Link encap:以太网 硬件地址 8c:ec:4b:bb:da:df
inet 地址:192.168.20.41 广播:192.168.20.255 掩码:255.255.255.0
inet6 地址: fe80::932c:80ab:7037:fe6c/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1
接收数据包:1106464847 错误:0 丢弃:6 过载:0 帧数:0
发送数据包:4675505 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:1000
接收字节:168711550721 (168.7 GB) 发送字节:758438621 (758.4 MB)
docker内部网络
[root@7bf53443e078 srs]# ifconfig
eth0: flags=4163 mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 15850 bytes 23756006 (22.6 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8560 bytes 588135 (574.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
常见错误
一. 登录出现错误:Permission denied (publickey).
生产机器默认禁用了ssh密码登录权限。
解决办法
1、登录目标机器 打开 /etc/ssh/sshd_config ,修改PasswordAuthentication no 为:
PasswordAuthentication yes
2、重启服务
/etc/init.d/sshd restart
二. docker容器故障致无法启动解决实例
修改宕机容器配置
所有的容器数据都存在/var/lib/docker/aufs/diff/路径下。下面容器ID目录,以init结尾的是放配置文件的,有/etc/host、reselv.conf,/dev等。另一个是放的文件目录,比如/home,/var/及自己安装的服务等等,aufs需要内核3.10以上的支持。
1、查看容器id
root@ubuntu:~#docker ps -a|grep iframe-test
fa02f8084b63 debian06-base:latest
2、查找nginx.conf配置文件路径
root@ubuntu:~#find / -name 'nginx.conf'
/root/nginx.conf
/var/lib/docker/aufs/diff/7c7b3438586e0653cdca7977a4f889cfdca300f008771462f8a2e6e9d3bc5b84/etc/nginx/nginx.conf
/var/lib/docker/aufs/diff/6bc6a9a5aeb59e19cae8bb78daa481cc465051069c7854528cbfdb3c9c1f2bfb/etc/nginx/nginx.conf
/var/lib/docker/aufs/diff/c7b6b87cfda72701229eebca868eb047aa01c255b62e56ad223dc75396c584e4/etc/nginx/nginx.conf
/var/lib/docker/aufs/diff/fa02f8084b631c371c6c050e5f0315017d327f84746b064246803a6a90a39456/etc/nginx/nginx.conf
3、进入对应容器id的目录,修改问题文件
root@ubuntu:cd /var/lib/docker/aufs/diff/fa02f8084b631c371c6c050e5f0315017d327f84746b064246803a6a90a39456
执行ls命令,容器的根目录展现在面前,是不是很熟悉?
root@ubuntu:/var/lib/docker/aufs/diff/fa02f8084b631c371c6c050e5f0315017d327f84746b064246803a6a90a39456#ls
etc root run srv tmp usr var
接下来找到这个容器里面nginx.conf的语法错误处修改。
4、修改后启动容器
root@ubuntu:~# docker start iframe-test
root@ubuntu:~# docker ps |grep iframe-test
fa02f8084b63 debian06-base:latest "/etc/rc.local" 6 weeks ago Up 13 minutes 10.18.103.2:22->22/tcp,10.18.103.2:80->80/tcp, 10.18.103.2:443->443/tcp,10.18.103.2:3306->3306/tcp, 10.18.103.2:6379->6379/tcp,10.18.103.2:6381->6381/tcp, 10.18.103.2:8000->8000/tcp,10.18.103.2:8888->8888/tcp iframe-test
容器启动成功,问题解决。以后再也不用担心docker容器坏掉,导致数据丢失了。
三.解决ssh登陆到docker容器自动退出的问题
情况如下:
[root@localhost docker]# ssh [email protected] -p10022
[email protected]'s password:
Welcome to Ubuntu Xenial Xerus (development branch) (GNU/Linux 3.10.0-957.el7.x86_64 x86_64)
* Documentation: https://help.ubuntu.com/
Last login: Tue Jul 16 10:53:37 2019 from 172.17.0.1
Connection to 127.0.0.1 closed.
[root@localhost docker]#
看了网上的解决办法用docker attach或者docker exec登录然后修改/etc/ssh/sshd_config中UsePAM yes字段为UsePAM no,但是两种方法都登不上去,无奈在源镜像中修改后导入新的镜像,最后该问题解决
四. 解决docker容器存放目录磁盘空间满了问题
docker所在服务器,运行了一段时间后,发现服务器磁盘目录快不够用了。通过du -h --max-depth=1 / 逐级目录排查,发现/var/lib/docker目录文件过大。通过以下方法,解决该问题。
转移数据修改docker默认存储位置
有多种方式修改docker默认存储位置。
最好是在docker安装完后,第一时间修改docker默认存储位置为其他大目录或者磁盘中。规避迁移数据过程中造成的风险。
- 停止docker服务
systemctl stop docker
*创建新的docker目录,执行命令df -h,找一个大的磁盘
我在 /home目录下面建了/home/modules/docker/lib目录
mkdir -p /home/modules/docker/lib
- 迁移/var/lib/docker目录下面的文件到/home/modules/docker/lib
迁移后的完成docker路径:/home/modules/docker/lib/docker
rsync -avz /var/lib/docker/ /home/modules/docker/lib/
- 配置 /etc/systemd/system/docker.service.d/devicemapper.conf
查看/etc/systemd/system/docker.service.d目录及devicemapper.conf是否存在。如果不存在,就新建
mkdir -p /etc/systemd/system/docker.service.d/
vi /etc/systemd/system/docker.service.d/devicemapper.conf
devicemapper.conf添加如下内容:
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --graph=/home/modules/docker/lib/docker
- 重启docker
systemctl daemon-reload
systemctl restart docker
systemctl enable docker
- 确认Docker Root Dir修改是否已经生效
[root@iZbp1jcwx7sfb1yrnvpg84Z docker]# docker info
...
Docker Root Dir: /home/modules/docker/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
...
- 启动成功后,再确认之前的镜像是否还在
[root@iZbp1jcwx7sfb1yrnvpg84Z docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
10.80.177.233/policy 2.1.2 64ac4e178cd2 2 hours ago 818 MB
10.80.177.233/crm 2.1.3 d7636fbb7a29 2 hours ago 762 MB
确定容器没问题后删除/var/lib/docker/目录中的文件