###首先我们先要对docker有一个了解:Docker是一个开源的容器引擎,它基于LXC容器技术,使用Go语言开发。
源代码托管在Github上,并遵从Apache2.0协议。
Docker采用C/S架构,其可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。
简单来说:Docker就是一种快速解决生产问题的一种技术手段。我们也可以将他理解为实现虚拟技术的一种

[docker官网](http://www.docker.com)

[github docker源码](https://github.com/docker/docker)

1.在Ubuntu中安装docker

添加Docker官方GPG key

  sudo apt-key add gpg

安装Docker稳定版

sudo dpkg -i docker-ce_17.03.2~ce-0~ubuntu-xenial_amd64.deb

检查Docker是否安装正确

sudo docker run hello-world

如果出现下面的结果,证明安装成功

为了避免每次命令都输入sudo,可以设置用户权限,注意执行后须注销重新登录

sudo usermod -a -G docker $USER


2.docker的启动与停止
# 启动docker
sudo service docker start

# 停止docker
sudo service docker stop

# 重启docker
sudo service docker restart


3.docker镜像操作

 

要想获取某个镜像,我们可以使用pull命令,从仓库中拉取镜像到本地,如

 

docker image pull library/hello-world

删除镜像

docker image rm 镜像名或镜像id

docker image rm hello-world

查看镜像历史

docker history 镜像名:版本

查看镜像

docker images

镜像 重命名
命令格式:
docker tag [old_image]:[old_version] [new_image]:[new_version]
命令演示:
docker tag nginx:latest sswang-nginx:v1.0

4.docker容器操作

创建容器

docker run [option] 镜像名 [向启动容器中传入的命令]

常用的选项如下

交互式容器

例如,创建一个交互式容器,并命名为myubuntu

docker run -it --name=myubuntu ubuntu /bin/bash

守护式容器

创建一个守护式容器:如果对于一个需要长期运行的容器来说,我们可以创建一个守护式容器。在容器内部exit退出时,容器也不会停止。

docker run -dit --name=myubuntu2 ubuntu

进入已运行的容器

docker exec -it 容器名或容器id 进入后执行的第一个命令

docker exec -it myubuntu2 /bin/bash

查看容器

# 列出本机正在运行的容器
docker container ls

# 列出本机所有容器,包括已经终止运行的
docker container ls --all

删除容器

docker container rm 容器名或容器id

停止与启动容器

# 停止一个已经在运行的容器
docker container stop 容器名或容器id

# 启动一个已经停止的容器
docker container start 容器名或容器id

# kill掉一个已经在运行的容器
docker container kill 容器名或容器id

删除容器

docker container rm 容器名或容器id

5. 将容器保存为镜像

我们可以通过如下命令将容器保存为镜像

docker commit 容器名 镜像名

6. 镜像备份与迁移

我们可以通过save命令将镜像打包成文件,拷贝给别人使用

docker save -o 保存的文件名 镜像名

docker save -o ./ubuntu.tar ubuntu

在拿到镜像文件后,可以通过load方法,将镜像加载到本地

docker load -i ./ubuntu.tar

#7.仓库管理

##1)仓库类型:

&nbsp公有仓库:Docker hub、Docker cloud等

&nbsp私有仓库:registry、harbor等

&nbsp本地仓库:在当前主机存储镜像的地方

##2)仓库相关命令:

```

docker login [仓库名称]
docker pull [镜像名称]
docker push [镜像名称]
docker search [镜像名称]

```

##3).私有仓库的部署

###实施步骤:

###1>下载registry镜像

###docker pull registry
###2>启动仓库容器
###docker run -d -p 5000:5000 registry

###3>检查容器效果
###curl 127.0.0.1:5000/v2/_catalog

###4>配置容器权限

```
sudo vim /etc/docker/daemon.json
{"registry-mirrors": ["http://74f21445.m.daocloud.io"], "insecure-registries": ["192.168.8.14:
5000"]}

```
###注意:私有仓库的ip地址是宿主机的ip,而且ip两侧有双引号
###5>重启docker服务

###systemctl restart docker
###systemctl status docker

###6>启动容器

###docker start registry 容器的 id
###7>标记镜像
###docker tag hello-author1 192.168.8.14:5000/hello-author1
###8>提交镜像
###docker push 192.168.8.14:5000/hello-author1
###9>下载镜像
###docker pull 192.168.8.14:5000/hello-author1

 #8.数据管理

###docker的镜像是只读的,虽然依据镜像创建的容器可以进行操作,但是我们不能将数据保存到容器中,因为容器会

###随时关闭和开启,容器一旦破坏,那所有的数据也会消失,解决办法就是将宿主机的磁盘与容器的磁盘进行映射,即通过数据卷和数据卷容器

###下面我们只对数据卷进行演示,对于数据卷的管理我们从两个方面来说

###1.目录

```

#命令格式:
docker run -itd --name [容器名字] -v [宿主机目录]:[容器目录] [镜像名称] [命令(可选)]
#命令演示:
#创建测试文件
echo "hello" > /tmp/hello.txt
#启动一个容器,挂载数据卷
docker run -itd --name test1 -v /tmp:/test1 nginx
#测试效果
docker exec -it a53c61c77 /bin/bash
root@a53c61c77bde:/# cat /test1/hello.txt
hello

```

###2.文件

```
#命令格式:
docker run -itd --name [容器名字] -v [宿主机文件]:[容器文件] [镜像名称] [命令(可选)]
#注意:容器里面的文件虽然可以改名,但类型必须和宿主机文件一致
#命令演示:
#创建测试文件
echo "hello1" > /tmp/hello1.txt
#启动一个容器,挂载数据卷
#内部架构文档
15
docker run -itd --name test2 -v /tmp/hello1.txt:/nihao/nihao.sh nginx
#测试效果
docker exec -it 84c37743 /bin/bash
root@84c37743d339:/# cat /nihao/nihao.sh
hello1

```

##数据卷的删除操作

```

docker volume rm
docker volume prune

```

#9.网络管理

##常见的docker的网络模式:

###bridge模式:相当于Ubuntu的NAT模式,与宿主机共用一个ip地址,并没有真实的ip,只有一个虚拟的IP地址,默认的是这种网络模式

###host模式:容器和宿主机共享一个ip,推荐使用这种网络模式

##切换网络模式的命令:

```

docker run --network=host ......

```

###注:还有其他的几种网络模式,这里我们只介绍这常用的两种