首先,在Linux中安装Docker是有一个先决条件的,那就是必须是内核版本大于3.10的64位系统
所以我们安装docker的第一步首先应该检查内核版本是否大于3.10
[root@localhost ~]# uname -r
3.10.0-514.26.2.el7.x86_64
这里可以看到,版本刚好能够符合.
然后我们可以切换到root权限,登录终端
[root@localhost ~]$ su
这里我默认登录的是root权限所以不用切换
如果我们安装过旧版本的话,还需要卸载掉旧版本
[root@localhost ~]# yum remove docker
[root@localhost ~]# yum remove docker-common
[root@localhost ~]# yum remove docker-selinux
[root@localhost ~]# yum remove docker-engine
这里我没有安装过,所以这一步也可以省略了.
然后我们需要准备Linux上边需要的软件包
#yum-util提供yum-config-manager功能
#另外两个是devicemapper驱动依赖的
[root@localhost ~]# yum install -y yum-utils
[root@localhost ~]# yum install -y device-mapper-persistent-data
[root@localhost ~]# yum install -y lvm2
然后设置yum源
[root@localhost ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
那么,好了,做完上边几步,我们已经做好了安装Docker的准备工作,可以开始安装Docker了.
这里我们可以安装两种:
[root@localhost ~]# yum install -y docker-ce
#查询版本列表
[root@localhost ~]# yum list docker-ce --showduplicates | sort -r
Loading mirror speeds from cached hostfile
Loaded plugins: fastestmirror
Installed Packages
docker-ce.x86_64 3:18.09.3-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.3-3.el7 @docker-ce-stable
#指定版本安装(这里的例子是安装上面列表中的第二个)
$ yum install -y docker-ce-3:18.09.3-3.el7
这里安装完之后启动docker
[root@localhost ~]# systemctl start docker.service
[root@localhost ~]# docker version
Client:
Version: 18.09.3
API version: 1.39
Go version: go1.10.8
Git commit: 774a1f4
Built: Thu Feb 28 06:33:21 2019
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 18.09.3
API version: 1.39 (minimum version 1.12)
Go version: go1.10.8
Git commit: 774a1f4
Built: Thu Feb 28 06:02:24 2019
OS/Arch: linux/amd64
Experimental: false
这里若果显示了client和service两部分表示docker安装启动都已经完成了
学习编程的应该都知道,不论学习什么知识,上来先弄一个HelloWorld,那么我们学习Docker也从HelloWorld开始好了.
首先,我们需要学习Docker的第一条命令
拉取命令
docker pull [OPTIONS] NAME[:TAG]
这里用括号括起来的表示可选内容.其中docker pull
为命令主体,NAME这里需要填写Docker仓库中镜像的名字,TAG填写镜像的版本,OPTIONS填写执行命令的选项.
查看本机镜像列表
docker images [OPTIONS] [REPOSITORY[:TAG]]
这里括起来的也是可选内容,OPTIONS是执行命令的选项,REPOSITORY可以指定一个镜像的名称,TAG指定镜像的版本.
示例:这里我们用上述命令拉取一个镜像仓库,并查看本机镜像列表
[root@localhost ~]# docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:2557e3c07ed1e38f26e389462d03ed943586f744621577a99efb77324b0fe535
Status: Downloaded newer image for hello-world:latest
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest fce289e99eb9 2 months ago 1.84kB
注意这里可能会有一个疑惑,为什么我在上边拉取镜像的时候直接指定的是hello-world
镜像的名字,但是没有指定镜像的地址,这个如果前边没有指定地址的话就会默认到Docker的官方仓库去拉取镜像,这里也可以写成docker pull hub.c.163.com/library/hello-world:latest
就是去到网易云的镜像中心拉取镜像了.
这里我们拉取下来镜像之后,要做什么用呢?
当然是开始运行镜像.所以这里我们可以学习一个新的命令.
镜像运行命令
docker run [OPTIONS] IMAGE[TAG] [COMMAND] [ARG...]
这里其他的都和上边相同,IMAGE填的是镜像的名字,COMMAND命令表示执行镜像的同时,镜像需要执行什么命令.ARG表示执行COMMAND的时候的一些参数.
这里我们可以试着运行一下上边拉取下来的镜像.
[root@localhost ~]# docker run hello-world
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.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
这里虽然上边已经试着对Docker进行了一些基础的操作,但是毕竟Hello-world不是实际使用到的项目,所以这里试着在Docker中运行一个Nginx的镜像.
首先,还是需要拉取一个Nginx的镜像.
这里可以去网易镜像中心去查看nginx的镜像地址,这里可以发现有两个nginx的地址,这里两个都是可以使用的,但是前边带有library并且图标上有一个鲸鱼图案的表示时Docker官方镜像同步过来的,所以一般都使用这个.
这里在镜像中心找到地址,并执行拉取命令.并且可以看到本地已经多了一个nginx的镜像.
[root@localhost ~]# docker pull hub.c.163.com/library/nginx:latest
latest: Pulling from library/nginx
5de4b4d551f8: Pull complete
d4b36a5e9443: Pull complete
0af1f0713557: Pull complete
Digest: sha256:f84932f738583e0169f94af9b2d5201be2dbacc1578de73b09a6dfaaa07801d6
Status: Downloaded newer image for hub.c.163.com/library/nginx:latest
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest fce289e99eb9 2 months ago 1.84kB
hub.c.163.com/library/nginx latest 46102226f2fd 23 months ago 109MB
这里我们执行一下nginx镜像.
[root@localhost ~]# docker run hub.c.163.com/library/nginx
可以看到运行之后没有反应,这时候我们就需要学习一个新命令:
查看当前运行镜像
docker ps
这里我们新建一个终端,执行查看命令.
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ded3f4d65764 hub.c.163.com/library/nginx "nginx -g 'daemon of…" 2 minutes ago Up 2 minutes 80/tcp trusting_khorana
这里我们已经能够看到,nginx已经执行起来了,但是我们这样用会很不方便,前台运行之后,我们就不能在终端上执行其他命令了,尤其是像我这种Xshell登录的用户,每次新建窗口会很难受,所以这里Docker也提供了后台运行的命令.
可以通过docker run --help
命令进行查看,发现后台运行的选项是-d
所以这里可以通过ctrl+C
停止刚才的前端运行,然后执行一下后台运行的命令试试看.
[root@localhost ~]# docker run -d hub.c.163.com/library/nginx
fa8f0d3d2a9d457fa67ebc7902f7082f5caecaf176c7b24669d27f113dfe3bc4
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fa8f0d3d2a9d hub.c.163.com/library/nginx "nginx -g 'daemon of…" 23 seconds ago Up 21 seconds 80/tcp musing_kowalevski
这里可以看到,后台运行不会影响到我们的后续操作,同时也能后运行nginx.
进入运行的镜像执行命令
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
这里的的内容大多和之前的相同,CONTAINER表示容器名称,但是有两个重要的选项需要强调.
-i
没有输入命令的时候,保证命令有效-t
可以创建一个虚拟终端,供我们进行操作所以我们可以进行nginx的容器中执行操作
[root@localhost ~]# docker exec -it fa bash
root@fa8f0d3d2a9d:/#
这里我们就相当于在一个linux的虚拟机进行操作:
可以查看一下nginx所在位置.
root@fa8f0d3d2a9d:/# which nginx
/usr/sbin/nginx
可以查看运行了哪些进程
root@fa8f0d3d2a9d:/# ps -ef
exit退出进程
root@fa8f0d3d2a9d:/# exit
exit
Docker网络类型
这里当选择网络类型是桥接的时候,就需要进行端口映射
-p 主机端口:容器端口
将主机端口与容器端口一对一映射-P
将所有容器端口都映射到随机的主机端口停止容器
docker stop name
这里可以通过这条命令在启动的同时进行端口映射,这里表示将主机的8080端口映射到容器的80端口.
[root@localhost ~]# docker run -d -p 8080:80 hub.c.163.com/library/nginx
5725e57b7a2b51f348399884151d6bfdf9da9b7aa027fef0517cfb1480321361
可以在linux中通过netstat
命令查看端口是否开放
[root@localhost ~]# netstat -na | grep 8080
首先我们需要书写我们的Dockerfile
[root@localhost ~]# vi Dockerfile
Dockerfile内容
from hub.c.163.com/library/tomcat ##这里告诉docker我要做一个自己的镜像,这个镜像基于Tomcat
MAINTAINER chriszj xxx@163.com ##这里是告诉所有者的信息,名字和邮箱
COPY XXX.war /usr/local/tomcat/webapps ## 将我们想要运行的jar包拷贝到tomcat下
docker build Dockerfile位置
这里由于在当前目录,可以这样构建
docker build -t 镜像名字:TAG . ## .代表当前目录
然后通过run执行就可以了.
docker pull
从远端获取imagedocker build
创建imagedocker images
列出当前容器所有imagesdocker run
运行当前容器docker ps
列出当前正在运行的容器docker rm
删除一个容器docker rmi
删除imagedocker cp
在主机与容器间拷贝文件docker commit
保存容器中的改动为新的image这里需要注意,Dockerfile中的每一行都会产生一个新层.
用于提供独立于容器之外的持久化存储.
docker的这个特性可以用于在容器中的数据共享.
有三种方式:
docker run -v /usr/share/nginx/html nginx
这个命令可以用于将本地的主机命令挂载到nginx下的/usr/share/nginx/html
目录下,用于将docker容器中的数据与主机共享.可以通过docker inspect 容器名
检查主机中挂载到容器中的目录位置.docker run -v $PWD/code:/var/www.html nginx
这个命令用于将主机当前目录下的code
目录挂载到容器下的/var/www/html
下,这里的$PWD
是linux中的环境变量,代表当前目录,同时这里的两个目录中的文件可以做到数据共享,主机目录下的文件改变,容器的文件也会改变,容器文件改变,主机文件也会相应修改.docker run --volumes-from 数据容器
这里主要将一个仅有数据的容器挂载到当前容器中,可以做到两个容器数据共享.docker中的术语
对镜像仓库进行的操作
docker search 镜像名
可以从镜像仓库搜索想要的目标镜像docker pull 镜像名
可以从镜像仓库拉取想要的镜像docker push myname/镜像名
可以将自己构建的镜像上传到仓库最后,能力不足,水平有限,欢迎指正.