Docker-私有仓库

为什么要有私有仓库?
1.为了速度。默认的仓库是https://hub.docker.com/,远隔千山万水,还有其他原因,导致很慢,私有仓库可以设置为代理,本地网络中的仓库,速度完全取决于自己的路由器能力。
2.为了安全。对于有安全需求的人来说,自己的数据在网络上传输总是存在安全隐患。不走外网才是王道。

就为了速度来一个仓库也值得
私有仓库有好多,建议使用nexus,理由是:1.Free;2.功能全,除了Docker仓库,也是maven仓库,npm仓库…

过程如下
1.下载安装包
https://www.sonatype.com/download-oss-sonatype
根据自己的系统选择对应下载链接,我使用的是nexus-3.2.0-01-unix.tar.gz
2.安装依赖内容Java 1.8以上版本,这里不讲
3.解压缩在本地目录
4.进入nexus-3.2.0-01-unix/nexus-3.2.0-01目录,执行./bin/nexus start,既可以启动nexus
此时已经打开本地的8081端口,在浏览器录入http://localhost:8081,使用admin密码admin123登录可以开始配置nexus
5.选择配置(界面上的齿轮)->点击Repositories->点击Create repositoy->选择docker(hosted)->录入Name,比如docker-host->录入http的端口号,比如8088->点击最下方的create repository按钮。此时我们在本地建立了一个可以存储image的repository
6.使用这个repository。在docker中配置Insecure registries,将{本机地址}:8088添加进去。
MAC上可以直接点击docker图标配置;Linux上需要配置/etc/sysconfig/docker,增加INSECURE_REGISTRY=’–insecure-registry {本机地址}:8088′
之后保存配置重启docker服务。Mac上直接通过图标重启;Linux上执行命令service docker restart
重启docker后执行命令docker login {本机地址}:8088 -u admin -p admin123
7.现在可以将Image zhangsan/superapp推送到这个仓库了。执行如下命令即可
docker tag zhangsan/superapp {本机地址}:8088/zhangsan/superapp
docker push {本机地址}:8088/zhangsan/superapp
8.其他获取Image的需要执行第6步,之后执行docker pull {本机地址}:8088/zhangsan/superapp

私有仓库除了可以保存自己的Image,还能代理其他服务器,过程
1.选择配置(界面上的齿轮)->点击Repositories->点击Create repositoy->选择docker(proxy)->录入Name,比如docker-hub->录入http的端口号,比如8089->录入Remote storage,比如https://registry-1.docker.io//->点击View certificate->点击Add certificate to truststore->选择Docker Index为use Docker Hub->最下方的create repository按钮。此时创建了我们的代理
2.参照安装流程中第6步,增加8089端口到Insecure registries.
执行docker pull {本机地址}:8089/hello-world:latest既可以从服务器获取镜像,第一次获取比较慢,以后就非常快了

代理多个proxy和host的时候,可以使用docker(group)组织在一起使用。组只能pull不能push

各类型仓库含义
hosted:本地仓库,通常我们会部署自己的构件到这一类型的仓库。比如公司的第二方库。
proxy:代理仓库,它们被用来代理远程的公共仓库,如maven中央仓库。
group:仓库组,用来合并多个hosted/proxy仓库,当你的项目希望在多个repository使用资源时就不需要多次引用了,只需要引用一个group即可。

上一篇  下一篇

Docker-分享应用

几乎所有应用都不只是给自己用的。一般的应用可以直接把文件或者安装包拷贝给别人,我们的Docker Image呢?
我们获取他人的Image是从公共的Repository获取的,我们也可以将我们自己的Image发布上去,让别人下载
比如我们有一个Image叫superapp(Image的名称不能出现大写字母),现在我们将发布到公共的Repository上
这个是A方案
具体步骤如下
1.到官网https://hub.docker.com/注册一个免费账号(不喜欢注册账号的可以参见下面其他的不注册账号方法)
直接访问这个网站,录入名称,邮箱,将要使用的密码,之后到自己邮箱里面验证即可完成.我们录入的名称是zhangsan(注册的名称不能出现大写字母)
2.执行docker tag superapp zhangsan/superapp:1.0
这里将superapp重新打了一个标签,将自己的名字空间添加上去了,必须是自己的,否则没有权限。后面增加了一个自己的版本号,其实可以使用latest。
3.执行docker login。之后录入自己的用户名称zhangsan和密码。不要执行docker login docker.io,虽然也能执行成功,但是效果不一样,后面的命令会执行失败。
4.执行docker push zhangsan/superapp:1.0可能会因为网络问题,重试几次就好了

这样需要使用我们Image的人只需要执行docker pull zhangsan/superapp:1.0既可以获取我们的Image,或者通过Docker run zhangsan/superapp.1.0执行这个Image

对于不喜欢注册账号的还可以通过下面方法将自己的Image拷贝给别人,这个是B方案
1.执行命令docker save –output=”zhangsan_superapp.tar” zhangsan/superapp:latest,将image保存到了文件
2.将文件拷贝给他人
3.获得文件zhangsan_superapp.tar的人在本地执行docker load –input zhangsan_super.tar就可以将image导入到本地
之后就可以按照一般方式执行了

其实还有C方案,使用自己的私有Repository,参见下一篇

上一篇   下一篇

Docker-运行自己的应用

运行了别人放在docker中的应用了,现在我们来将自己的应用也放入Docker
比如可以使用java开发一个程序,这里不提供样例了,只要最终打包中可运行的jar都行,也可以从其他地方找一个jar文件过来
这里我们用test.jar。
在存放test.jar文件的目录中创建一个文件Dockerfile内容如下:
FROM frolvlad/alpine-oraclejdk8:slim
RUN mkdir /var/app
ADD test.jar app.jar
RUN sh -c ‘touch /app.jar’
WORKDIR /
ENV JAVA_OPTS=””
ENTRYPOINT [ “sh”, “-c”, “java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar >> /var/app/test.log 2>&1” ]

之后在Dockerfile目录中执行如下命令
docker build -t test:v1 .

再执行docker images,就能看到刚刚创建的名称是test,版本是v1的Image了
通过命令docker run -d test:v1即可执行这个image。

解释一下过程中的文件和命令
Dockerfile中内容
FROM:这个配置用于声明我们要创建的Image是基于其他的哪个Image创建的。每一个Image都必须有且只有一个这个配置。我使用的程序是一个java程序,所以选择了一个jdk的image。python的程序可以选择python的image,比如python:3.5。其实也可以使用最底层的系统级image,但是所有的东西需要自己弄会比较繁琐,个人根据自己情况选择。
RUN:这个配置用来在Image中运行脚本。这里只是创建了一个目录。
ADD:将本地文件添加到Image中
WORKDIR:用于指定工作目录。
ENV:设置可用的环境变量。这个变量是可以在启动的时候通过参数-e设置的变量。
ENTRYPOINT:设置docker image启动的时候需要执行的命令。
详细参见https://docs.docker.com/engine/reference/builder/

docker是通过分层的方式创建Image的,每个命令会独占一层,每次build的时候没有改变的Layer是不会被重新build的,因此将变化频繁的内容放在比较靠下的位置,可以提升Image的build速度。

docker的build命令
docker build -t test:v1 .
-t:用来指定这次build使用的tag信息,tag信息格式[{repository}/]{imageName}[:{version}]
repository:仓库信息,类似10.100.78.141:9443,可以省略
imageName:Image的名称,不可省略,不能带有空格,不能有横线,不能数字开头。(要求好多)
version:自己设定的Image版本信息,可以省略,默认为latest
注意这个命令的最后有一个点,这个点表示了当前路径,docker build会在当前路径找到Dockerfile文件进行build。
详细参见https://docs.docker.com/engine/reference/commandline/build/

上一篇  下一篇

Docker-分配资源

在前一篇Mysql已经运行起来了,细心的人可能发现两个问题
1.我本地已经安装了一个Mysql,3306端口已经占用,怎么办?
2.我的mysql数据存在哪里?如何能保证mysql在启停的过程中不丢失数据?万一我要删除Mysql,能保留数据吗?

问题1.我本地已经安装了一个Mysql,3306端口已经占用,怎么办?
我相信细心的人应该也已经注意到启动Mysql的命令行
docker run –name my-mysql-server -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
docker:这是docker控制台程序
run:docker控制台的一个命令,负责运行一个image,运行的时候可以指定一些参数
“-name my-mysql-server”:这个是run命令的参数,这个参数制定了一个名字给通过image启动的container。如果不提供名字docker daemon会随机分配一个名字,这个名字不能重复
“-p: 3306:3306”:这是run命令的参数,表示系统image启动后container的3306端口会被映射到本机的3306端口
“-e MYSQL_ROOT_PASSWORD=123456”:-e会传递一个环境变量到容器中,这个环境变量不同的应用不同,现在这个变量是Mysql设置root密码的变量,具体参见https://hub.docker.com/_/mysql
-d:这是run命令的参数,表示这个程序会是一个后台程序
“mysql”:这个是run命令的参数,是需要运行的image的名字和版本号。这里并没有给版本号,默认为latest,也没有指定repository,那么也会使用默认的repository。

所以修改-p参数就可以解决和本地mysql端口号冲突的问题;如果本地要运行多个mysql还需要修改容器名字,当然这个名字也可以忽略,如果要操作这些容器的时候除了使用名称,也可以使用id,参见命令docker ps的第一列,e5ba75509bf3就是刚刚启动容器的id,docker的命令在需要填写name的地方,填写id也一样管用。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e5ba75509bf3 mysql “docker-entrypoint…” 11 hours ago Up 11 hours 0.0.0.0:3306->3306/tcp my-mysql-server

问题2.我的mysql数据存在哪里?如何能保证mysql在启停的过程中不丢失数据?万一我要删除Mysql,能保留数据吗?
2.1 我的msql数据存在哪里?
默认数据存放在容器中,容器被删除,容器中的数据会跟着被删除,有些容器会自动将数据映射到一个系统目录中,但还是会跟着容器一起被删除。
2.2 如何保证mysql在启停的过程中不丢失数据?
在执行命令docker stop my-mysql-server的时候容器被停止,但数据已经被写到硬盘上,再次启动,执行docker start my-mysql-server的时候,数据还会在
2.3 万一我要删除Mysql,能保留数据吗?
如果执行了命令docker rm -f my-mysql-server,容器将被删除,数据丢失。要保留数据,需要引入另外一个参数-v。
这个-v参数可以将本地目录映射到容器中,这样容器删除的时候数据就能留下,重新启动新的容器时,只要将这个目录映射进去,就能得到以前的数据。
docker run –name my-mysql-server -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d -v /my/own/datadir:/var/lib/mysql mysql
这里的/my/own/datadir就是本地用于保存数据的路径,必须是绝对路径,目录可以不存在
/var/lib/mysql是容器中路径,不同工具需要映射的内部路径不一样需要参照对应说明文档

上一篇  下一篇

Docker-运行应用

Hello Docker中提到了一些安装应用的问题,现在我们有一个实际的问题:本地运行Mysql。
一般过程应该是
1.下载Mysql安装包
2.安装
3.配置,启动
4.不用的时候卸载

我们在Docker世界的解决方式是
1.找到合适版本的Mysql
2.启动
3.删除不需要的Container或者Image

开工
1.找合适的版本
执行命令docker search mysql,显示
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relati… 3648 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Crea… 239 [OK]
centurylink/mysql Image containing mysql. Optimized to be li… 47 [OK]
sameersbn/mysql 41 [OK]
zabbix/zabbix-server-mysql Zabbix Server with MySQL database support 20 [OK]
appcontainers/mysql Centos/Debian Based Customizable MySQL Con… 8 [OK]
marvambass/mysql MySQL Server based on Ubuntu 14.04 7 [OK]
dnhsoft/mysql-utf8 Inherits the official MySQL image configur… 5 [OK]
bitnami/mysql Bitnami MySQL Docker Image 3 [OK]
frodenas/mysql A Docker Image for MySQL 3 [OK]
alterway/mysql Docker Mysql 3 [OK]
yfix/mysql Yfix docker built mysql 2 [OK]
drupaldocker/mysql MySQL for Drupal 2 [OK]
debezium/example-mysql Example MySQL database server with a simpl… 1 [OK]
lysender/mysql MySQL base image using Ubuntu 16.04 Xenial 1 [OK]
coscale/mysql CoScale custom configuration of the offici… 1 [OK]
newrelic/mysql-plugin New Relic Plugin for monitoring MySQL data… 1 [OK]
captomd/mysql CaptoMD mysql configuration 0 [OK]
nanobox/mysql MySQL service for nanobox.io 0 [OK]
datajoint/mysql MySQL image pre-configured to work smoothl… 0 [OK]
projectomakase/mysql Docker image for MySQL 0 [OK]
cloudposse/mysql Improved mysql service with support for … 0 [OK]
tozd/mysql MySQL (MariaDB fork) Docker image. 0 [OK]
1maa/mysql MySQL database 0 [OK]
dockerizedrupal/mysql mysql-for-docker 0 [OK]
找到很多,建议使用STARS数量最多的
mysql MySQL is a widely used, open-source relati… 3648 [OK]
这个image的名称就是mysql,没有任何的前缀

其他更为详细的信息,包括版本不好和使用方法可以在https://hub.docker.com找到,打开后直接搜索即可。懒癌患者可以直接下一步。

2.启动
执行命令docker run –name my-mysql-server -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
控制台显示如下
Unable to find image ‘mysql:latest’ locally
latest: Pulling from library/mysql
75a822cd7888: Already exists
b8d5846e536a: Pull complete
b75e9152a170: Pull complete
832e6b030496: Pull complete
fe4a6c835905: Pull complete
c3f247e29ab1: Pull complete
21be3e562071: Pull complete
c7399d6bf033: Pull complete
ccdaeae6c735: Pull complete
713c7d65b0d3: Pull complete
86c18539deb2: Pull complete
Digest: sha256:9ef4478a3aa597f59b2266d5702f55f29acc468b5bf3518c3c90cbca4e243823
Status: Downloaded newer image for mysql:latest
84f92f38fe5f092f42ff65b5bc31322edae5663ff5582045078b351504ebca6d
需要等待一会,毕竟需要下载mysql。
现在运行docker ps可以看到刚刚启动的mysql,已经工作了
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e5ba75509bf3 mysql “docker-entrypoint…” 15 minutes ago Up 2 seconds 0.0.0.0:3306->3306/tcp my-mysql-server
使用其他工具连接一下mysql,可以发现已经可以是用了

>mysql -h 127.0.0.1 -u root -p
Enter password:(密码是我们启动程序时设置的123456)
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.17 MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

mysql>

3.删除
想要停止这个mysql只需要执行docker stop my-mysql-server
想要删除这个mysql,执行docker rm -f my-mysql-server
想要彻底删除mysql程序文件,执行docker rmi -f mysql
保证系统里面不会残留任何东西,不会动其他应用的任何配置,安装过程只有一句话

上一篇    下一篇

Docker一览

Docker的世界中有这些名词

docker

Hello Docker中安装的Docker就是Docker daemon
命令中的nginx:1.11就是Image名称
–name webserver指定了新建的Container名称为webserver
没有指定Repository,Docker daemon使用了默认的Repository https://registry-1.docker.io
也没有指定需要执行的Program,Image中定义了需要执行的应用,这里应该是nginx。

上一篇      下一篇

Hello Docker

Docker是什么
我们应该都遇到过这样的问题。
1、需要用一个应用A,安装了,用完不用了,又卸载了。但系统里面还是留下了他的痕迹。多个应用安装卸载后,系统里面遍地垃圾。但是有时候垃圾就在你面前你也不敢删除,鬼知道面前的这个文件是谁用的。
2、需要用一个应用A,安装了A,结果另外一个应用B不能使用了。因为这个应用A和另外的一个应用B需要的环境配置有冲突,卸载掉应用A应用B仍然不能用。(让我哭一会)
3、需要用一个应用A,安装的时候提示需要安装B,安装B后再次安装A,提示需要配置XXX…很多的依赖和配置项,少了哪个都不行。有些不友好的应用连个提示都不给,感觉距离可以使用就差那么一个永无休止的一点点。

Docker就是用来解决这些问题的。Docker类似于虚拟机,但是比虚拟机轻量,性能高。

下面体验Docker如何使用的。目标:通过简单的操纵实现本机运行一个Docker应用。

1.安装
下载安装Docker,之后直接执行即可。
https://www.docker.com/
Mac下载:
https://download.docker.com/mac/stable/Docker.dmg
Windows 10 Pro Or Enterprise 64-bit下载:
https://download.docker.com/win/stable/InstallDocker.msi

2.运行一个Images
docker run -d -p 8099:80 –name webserver nginx:1.11
这个命令可能会运行一会,时间取决于自己的网络状况,运行之后的效果就是,打开http://localhost:8099可以看到nginx的欢迎画面

welcometonginx

是否感觉太简单了,本地安装nginx并运行,一气呵成

还有另外一个例子运行docker run hello-world
显示如下信息
Unable to find image ‘hello-world:latest’ locally
latest: Pulling from library/hello-world
c04b14da8d14: Pull complete
Digest: sha256:0256e8a36e2070f7bf2d0b0763dbabdd67798512411de4cdcf9431a1feb60fd9
Status: Downloaded newer image for hello-world:latest

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.
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 Hub account:
https://hub.docker.com

For more examples and ideas, visit:
https://docs.docker.com/engine/userguide/

下一篇