本文目的:在Linux上可以运行docker,顺带说说一些Linux系统的常识(例如systemctl怎么配置,或者软连接啥意思),就是没怎么玩过Linux的人可能有用,玩过Linux的可以忽略此文,自行安装
本系列目的:从入门到实践,最后会完成一个可投入生产的一个实践,刚刚开始比较基础,后面慢慢的深入
环境:centos7
1、下载docker
下载地址:https://download.docker.com/linux/static/stable/x86_64/docker-19.03.5.tgz 可以自己选最新的稳定版本(我这里的目录是 Linux / 静态二进制文件 / 64位 / 19.03.5版本
)的软件压缩包,也可以自己找到自己想要的版本。(二进制文件的意思就是机器可以执行的文件
) 然后想方设法搞到你的服务器例如:
wget https://download.docker.com/linux/static/stable/x86_64/docker-19.03.5.tgz
或者你直接下载后FTP到服务器。 这个下载有可能被墙,你们自己看着办。
[root@localhost docker-static]# ll
total 61772
-rw-r--r-- 1 root root 63252595 Nov 14 13:25 docker-19.03.5.tgz
2、安装docker
官方文档:https://docs.docker.com/install/linux/docker-ce/binaries/#install-static-binaries 其实已经很简单粗暴了
A、解压:
tar xzvf docker-19.03.5.tgz ## 以为我这里下载下来的名字是docker-19.03.5.tgz,你们可以根据自己下载下来的包的名字改:tar xzvf 包名,来进行解压
这时候解压出来如下
[root@localhost docker-static]# ll
total 61772
drwxrwxr-x 2 1000 1000 138 Nov 13 02:30 docker
-rw-r--r-- 1 root root 63252595 Nov 14 13:25 docker-19.03.5.tgz
B、复制到/usr/bin/
然后CP这个docker目录到/usr/bin
,因为我们在输入命令例如:yum/wget/vim
之类的命令的时候,Linux就会跑到这个目录下面找下是否有这个目录或者文件 然后去执行,你也可以建立软链接进行关联,这么做可能大概的好处是你的系统盘满了,然后程序安装在挂载盘的地方,就弄个链接过来,软连接的功能和win里面的快捷方式是一样的。
做完之后就可以敲下下面第一个命令看看,其实第一个命令的生效就是因为我们把docker复制到/usr/bin中,当我们敲下docker回车的时候 系统就找到 /usr/bin 然后在这个目录下面执行docker是一个道理
[root@localhost docker]# docker -v
Docker version 19.03.5, build 633a0ea838
[root@localhost docker]# /usr/bin/docker -v
Docker version 19.03.5, build 633a0ea838
C、守护dockerd
然后就是守护下dockerd
。
dockerd &
这里得说明一下的是 docker是一个命令行工具,真正的大佬是dockerd,就类似于数据库中,我们会用Navicat for MySQL去链接mysql,可是我们服务器里面也要启动mysqld服务,这里的docker只是等同于Navicat for MySQL(就是所谓的客户端)
,而dockerd就等同于mysqld(服务端)
,不信的话你别执行dockerd试试看:
[root@localhost docker]# docker run hello-world
docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.
docker问你: Is the docker daemon running?翻译过来就是,你特么docker服务都没启动,叫我来干嘛?
D、完成
当我们启动了dockerd后,第一件事自然就是:hello-world,验证下了
docker run hello-world
然后他就告诉你,hello-world镜像不存在 他在下载,然后下载完成,你就看看镜像,看看容器
[root@localhost docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest fce289e99eb9 11 months ago 1.84kB
[root@localhost docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f5e021d859be hello-world "/hello" 3 minutes ago Exited (0) 3 minutes ago intelligent_mclean
发现多了东西,run它
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
3、开机启动dockerd ,并加入centos7-systemctl大家庭
官方文档:https://docs.docker.com/v17.09/engine/admin/systemd/ 当你觉得安装好了之后,开开心心的关闭虚拟机或者因为某些原因重启了服务器,这时候就会发现:咦?我的docker呢,怎么还得再来一次dockerd &啊,这很麻烦,能不能每次都重启的时候就自动启动。 懒惰是第一生产力,恭喜你,进入了无休止的编程折腾系列,可是程序员就应该折腾,遇到问题追究到底,才能收获更多......问题。 dockerd &
的意思是让dockerd这个程序在后台运行,然鹅,在你重启服务器的时候,dockerd不会再次自动启动,而在centos7管理各类服务的工具是:systemctl
,我们可以通过systemctl进行stop(停止),start(启动),restart(重启),enable(开机启动),disable(取消开机启动)
等等的操作。(centos7以下是service,这个怎么弄?升级下服务器或者自己看官方文档去) 好了,迫不及待
[root@localhost docker]# sudo systemctl enable docker
Failed to execute operation: No such file or directory
这是啥意思,就是systemctl其实不是随随便便就能加入的,你需要配置一些东西。官方文档一笔带过。让你自己去搞 这里的配置文件存在:/usr/lib/systemd/system
,不过这个是系统文件的比较多,我们怂一点(官方建议),自己的写在:/etc/systemd/system/
然后我们可以想想安装过的服务,看看别人怎么写的,以下,我在后面加了一些注释
[root@localhost system]# find -name '*nginx*'
./nginx.service
./nginx.service.d
[root@localhost system]# vim nginx.service
[Unit]
## 描述服务干嘛的
Description=The nginx HTTP and reverse proxy server
## 描述服务是啥类型
After=network.target remote-fs.target nss-lookup.target
[Service]
## 告诉系统这是后台运行的形式
Type=forking
## 告保存运行时候pid(也就是进程ID可以PS查看)的文件
PIDFile=/run/nginx.pid
## 启动服务之前执行的命令
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
## 启动服务的时候需要执行的命令
ExecStart=/usr/sbin/nginx
## 重启服务的时候需要执行的命令
ExecReload=/bin/kill -s HUP $MAINPID
## 设置 杀死进程的第一步
KillSignal=SIGQUIT
## 超时时间
TimeoutStopSec=5
## 设置在单元停止时,杀死进程的方法 process 表示仅杀死主进程
KillMode=process
## 是否使用私有的临时目录
PrivateTmp=true
[Install]
##WantedBy字段:表示该服务所在的 Target.这个展开太多了 不做赘述
WantedBy=multi-user.target
好了,看完nginx的后,是不是胸有成竹的可以自己写一个docker的了,先等等,如果你是用虚拟机的话,麻烦先拍下虚拟机的快照,不然等下修改完重启都启动不了的时候,你就会学会怎么用Linux安全模式进入系统目录进行修复了,为了避免大家学习这个能力,还是老老实实的先备份。
下面是内容(来源于网络https://github.com/moby/moby/blob/master/contrib/init/systemd/docker.service.rpm)
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
保存,然后
[root@localhost docker.service.d]# systemctl start docker
Failed to start docker.service: Unit not found.
怎么肥事,ll查看一下,给他一个755权限
[root@localhost system]# chmod -R 755 ./docker.service.d/*
再来
[root@localhost system]# systemctl status docker.service
● docker.service - Docker Application
Loaded: loaded (/etc/systemd/system/docker.service; disabled; vendor preset: disabled)
Active: failed (Result: start-limit) since Mon 2019-12-09 02:39:10 EST; 1min 42s ago
Process: 405 ExecStart=/usr/bin/dockerd (code=killed, signal=TERM)
Main PID: 405 (code=killed, signal=TERM)
Dec 09 02:39:10 localhost.localdomain systemd[1]: Failed to start Docker Application.
Dec 09 02:39:10 localhost.localdomain systemd[1]: Unit docker.service entered failed state.
Dec 09 02:39:10 localhost.localdomain systemd[1]: docker.service failed.
Dec 09 02:39:10 localhost.localdomain systemd[1]: docker.service holdoff time over, scheduling restart.
Dec 09 02:39:10 localhost.localdomain systemd[1]: Stopped Docker Application.
Dec 09 02:39:10 localhost.localdomain systemd[1]: start request repeated too quickly for docker.service
Dec 09 02:39:10 localhost.localdomain systemd[1]: Failed to start Docker Application.
Dec 09 02:39:10 localhost.localdomain systemd[1]: Unit docker.service entered failed state.
Dec 09 02:39:10 localhost.localdomain systemd[1]: docker.service failed.
Warning: docker.service changed on disk. Run 'systemctl daemon-reload' to reload units.
嗯?run一下systemctl daemon-reload,好的
root@localhost system]# systemctl status docker.service
● docker.service
Loaded: not-found (Reason: No such file or directory)
Active: failed (Result: start-limit) since Mon 2019-12-09 02:39:10 EST; 4min 2s ago
Main PID: 405 (code=killed, signal=TERM)
Dec 09 02:39:10 localhost.localdomain systemd[1]: Failed to start Docker Application.
Dec 09 02:39:10 localhost.localdomain systemd[1]: Unit docker.service entered failed state.
Dec 09 02:39:10 localhost.localdomain systemd[1]: docker.service failed.
Dec 09 02:39:10 localhost.localdomain systemd[1]: docker.service holdoff time over, scheduling restart.
Dec 09 02:39:10 localhost.localdomain systemd[1]: Stopped Docker Application.
Dec 09 02:39:10 localhost.localdomain systemd[1]: start request repeated too quickly for docker.service
Dec 09 02:39:10 localhost.localdomain systemd[1]: Failed to start Docker Application.
Dec 09 02:39:10 localhost.localdomain systemd[1]: Unit docker.service entered failed state.
Dec 09 02:39:10 localhost.localdomain systemd[1]: docker.service failed.
哦?是不是刚刚启动的dockerd捣鬼,然后就是设置下开机启动systemctl enable docker
[root@localhost system]# ps -aux | grep dockerd
root 738 0.0 0.0 112712 964 pts/0 R+ 02:44 0:00 grep --color=auto dockerd
root 29593 0.0 2.9 443904 54720 pts/1 Sl 00:25 0:04 dockerd
[root@localhost system]# kill -9 29593
[root@localhost ~]# sudo systemctl start docker
[root@localhost ~]# ps -aux | grep dockerd
root 9855 0.1 1.9 500988 36772 ? Ssl 03:00 0:00 /usr/bin/dockerd
root 10060 0.0 0.0 112712 960 pts/0 R+ 03:01 0:00 grep --color=auto dockerd
[root@localhost ~]# docker -v
Docker version 19.03.5, build 633a0ea838
[root@localhost ~]# sudo systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /etc/systemd/system/docker.service.
重启查询进程,还在,搞定!