Docker使用笔记

本篇将记录使用docker的过程以及感想。

docker这个工具是属于运维布署的范畴,与程序开发,其实并没有多大的关系。在此,不妨讨论一下,程序开发与运维。如果一个程序员他所负责的工作只是软件开发,其实并不需要太过于关注运维。如果有面试官问你,你写了这么多年的代码,难道不知道什么叫做负载均衡吗?其实这可能是一句试探性的问题:看你能不能界清程序开发与运维的关系。大部分的应用程序开发人员,可能真的从没有写过这类的代码,也不用在写代码的过程考虑所开发的这个APP能否支持负载均衡,但却需要考虑是否支持高并发量等性能问题。说到这里,读者自辨,是否有继续阅读下去的必要。然而开发人员是不得不接触到一些运维的基本知识的,简单有如IIS,即便VS自带有IIS Express,大部分的.net开发人员还是有过使用Windows IIS 的经验,使用 Ctrl+Alt+P 附加进程 进行调试,因为这相对来说更能贴进生产环境。

下面,我们先举一个最简单的.net core web布署的例子,后面我们要做的事情如下:

1  安装.netcore sdk, nginx, supervisor, 或者 Jexus 这些基本的东西,安装完要改配置,配置完要重启检查是否生效。

2. 上传web应用文件

3. 修改nginx, 重启nginx

4. 修改supervisor, 重启supervisor

也许有人说这看起来好像是很简单的几步,但如果遇到下面的情况,运维人员可能会开始变得浮躁:

1. 要在多台服务器上一起布署这个应用;

2. 要布署一套开发环境,一套测试环境,一套售前沙箱环境,一套预生产环境;

如果都按上面几个步骤一个个去做,估计在做第三第四个的时候,就开始在怀疑的人生的意义何在了。

有需求就有供应,docker应运而生,尽管docker的强大之处不仅仅在于解决以上问题,但它确实解决以上问题的好工具。

docker是如何解决以上问题的,在贴命令之前,我还是先讲讲吧(命令、代码,链接谁都会贴,但不是谁都愿意讲个所以然)

1. 我们在一台机器上将web应用程序组装成一个组件,这个组件包含了一个应用程序运行环境的所有必要条件,以及这个应用程序本身的目录文件,就像一个房车,开到荒山野岭也能过夜。

2. 当我们要运行这个应用程序,我们要在服务器上开辟一个空间,以运行这个组件,那么接下来,是不是要把组件拷贝到这个空间里面,然后运行它。这个问题是docker一个关键点所在。当然不需要。

Docker将这个组件制作成一个镜像。当我们需要运行一个应用程序时,通过这个镜像去创造一个容器。这就有如面向对象开发语言中的类和实例,这个类的定义非常的丰富,里面包含了一个应用程序运行时的所有必要条件的定义。

我们知道实例化一个类的时候,是可以通过构造函数传参的,我们可以通过不同传参,去创建不同的运行容器,比如上述的开发环境,测试环境。

3. 当我们需要将这个web应用程序安装到另一台服务器的时候,又该如何?是不是上述12再搞一次,当然不行。我们需要将第一台机器的镜像共享出去,以让第二台机器可以通过第一台机器的镜像,去创建新的容器。

如何做:在第一台机器或者新开一台机器,用于创建镜像仓储,故名思义,这个仓储是用于存放镜像的仓库。将镜像上传至仓储之后,其实机器可以到这里来下载镜像,然后实例化运行容器。

以上便是用docker进行分布式发布应用的基本过程,可以快速地发布多环境,多站点。

接下来,我开始复制粘帖命令,贴链接,我用是的ubuntu 16.04

一、在第一台机器 192.168.40.128,用于制作一个镜像:

1. 安装docker,详见https://docs.docker.com/install/linux/docker-ce/ubuntu/

配置docker加速器 

  # vim /etc/docker/daemon.json

{

"registry-mirrors": ["https://d8b3zdiw.mirror.aliyuncs.com"]

}  

  然后重启docker服务

  # systemctl daemon-reload

  # systemctl restart docker

2. 上传应用程序文件到服务器上

  

3. 拉取dotnet/aspnetcore的最新镜像,这里以aspnetcore 2.0为例

# docker pull microsoft/aspnetcore:2.0

 4. 在这个目录创建一个文件 Dockerfile

里面内容:


# 父镜像
FROM microsoft/aspnetcore:2.0


# 设置工作目录
WORKDIR /app


# 复制发布文件到/app下
COPY . /app


#设置Docker容器对外暴露的端口
EXPOSE 80

#容器中使用 ["dotnet","系统启动的dll"] 来运行应用程序
#使用ENTRYPOINT [
"dotnet","系统启动的dll"]
#或使用 CMD [
"dotnet","系统启动的dll"]
ENTRYPOINT [
"dotnet", "DockerTest.dll"]

 5. 打包镜像

# docker build -t dnappbox:1.0 .

6. 打包完看一下

# docker images

7. 运行

#docker run -d -p 8081:80 --name dnapp1 dnappbox:1.0

8. 停止运行容器  --要先查看容器ID(#docker ps -a)

#docker stop {containerId}

9. 删除容器

#docker rm {containerId}

10. 删除镜像

#docker rmi {imageId}  --要先查到镜像ID;

11.删除镜像时,如果镜像被多个Repository所引用:

#docker rmi {repository}:{tag}

二、在第一台机器 192.168.40.128,创建一个镜像仓储

1. 下载Registry镜像并启动

#docker pull registry

2. 运行一个Registry镜像仓库的容器实例

#docker run -d -v /edc/images/registry:/var/lib/registry -p 5000:5000 --restart=always --name xdp-registry registry

3. 最后,在客户端查看镜像仓库中的所有镜像

curl http://192.168.40.128:5000/v2/_catalog

报错:error: Get https://192.168.40.128:5000/v2/_ping: http: server gave HTTP response to HTTPS client.

解决:# vim /etc/docker/daemon.json

  加上下面这一句:

{ 
    "insecure-registries" : [ "192.168.40.128:5000" ] 
}

重新启动docker服务:# systemctl restart docker

4. 上传镜像到仓储

a.为要上传的镜像打Tag  

#docker tag dnappbox:1.0 192.168.40.128:5000/dnappbox:1.0

b.上传镜像

#docker push 192.168.40.128::5000/dnappbox:1.0

5. 查看镜像

# docker images

三、 在第二台机器 192.168.40.129上传下载镜像,并运行之

1. 前提是这台机子也要安装docker服务

2. 下载镜像

docker pull 192.168.40.128:5000/dnappbox:1.0

3. 查看镜像

# docker images

4. 运行下载下来的镜像

#docker run -d -p 8011:80 --name dnappbox2 192.168.40.128:5000/dnappbox:1.0

5. 查看下本机所以镜像,以及镜像的容器的总体情况

#docker ps -a

以上记录了从一台机器生成镜像,上传至仓储,并在另一台机器下载镜像,然后运行一系列的具体步骤。

原文地址:https://www.cnblogs.com/wikiz/p/11685884.html