2016年10月30日星期日

Docker_006:运行自己的 docker registry

 环境:MAC OS  X 10.12.1 + Docker 1.12.1

1. 下载 registry 镜像
$ docker pull registry

2. 运行 registry 镜像
$ docker run -p 5000:5000 registry

3. 查看 hello-world 镜像
$ docker images hello-world
输出如下:
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              c54a2cc56cbb        6 months ago        1.848 kB

4. 给 hello-world 镜像打上新 registry 标签
$ docker tag hello-world localhost:5000/hello-world

5. 推到新的 registry
$ docker push localhost:5000/hello-world

6. 运行新的 registry 中的 hello-world 镜像
$ docker run localhost:5000/hello-world

7. 查看新的 registry 中的 hello-world 镜像
$ docker images localhost:5000/hello-world
输出如下:
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
localhost:5000/hello-world   latest              c54a2cc56cbb        6 months ago        1.848 kB
 

Docker_005:使用 Dockerfile 构建 docker image

环境:MAC OS  X 10.12.1 + Docker 1.12.1 

1. 创建
$ mkdir static_web
$ cd static_web
$ touch Dockerfile
文件内容如下:
# FROM ubuntu
FROM maping930883/apache2:webserver
MAINTAINER Ma Ping "maping930883@hotmail.com"
# RUN apt-get update
RUN apt-get install -y nginx
RUN echo 'Hi, I am in your container' > /usr/share/nginx/html/index.html
EXPOSE 80

$ docker build -t="maping930883/static_web" .
maping930883/static_web:v1 是镜像标签,其中 maping930883 是仓库,static_web 是镜像名称,如果没有 :v1,Docker 将自动为镜像设置一个 latest 标签。
命令中最后的 . 告诉 Docker 到本地目录中去找 Dockerfile 文件。

$ docker run -d -p 80 --name static_web maping930883/static_web nginx -g "daemon off;"
参数说明:
(1)-d 以后台方式运行 docker 容器。
(2)-p 80 也可以省略为 -p,这样对外公开在 Dockerfile 中的 EXPOSE 指令中设置的所有端口。
(3)nginx -g "daemon off;" 以前台方式运行 nginx。

$ docker ps
CONTAINER ID        IMAGE                     COMMAND                  CREATED              STATUS              PORTS                   NAMES
be5b4ceac719        maping930883/static_web   "nginx -g 'daemon off"   About a minute ago   Up About a minute   0.0.0.0:32768->80/tcp   static_web

$ docker port be5b4ceac719 80
0.0.0.0:32768
访问 http://localhost:32768/

2. push 刚创建的 docker image 到 Docker Hub 上
(1)注册 https://hub.docker.com/
说明:
MAC 环境下,你的身份验证凭证将被存储在 ~/.docker/config.json 文件中。
{
    "auths": {
        "https://index.docker.io/v1/": {
            "auth": "bWFwaW5nOTMwODgzOk1hcCM5ODc2"
        }
    }
}
Linux 环境下,你的身份验证凭证将被存储在 ~/.dockercfg 文件中。
(2)$ docker login
(3)$ docker push maping930883/static_web
(4)$ docker logout

3. Dockerfile 中的指令及参数说明
每条指令都必须是大写字符,# 开头的为注释。

(1)FROM:第1条指令,指定一个已经存在的镜像。
(2)MAINTAINER:告诉 Docker 该镜像的作者是谁
(3)RUN:构建当前镜像要运行的命令,每条 RUN 指令都会创建一个新的镜像层。
(4)EXPOSE:告诉 Docker 该容器内的应用将会使用容器的指定端口。
(5)CMD:指定一个容器启动时要运行的命令。在 Dockerfile 中只能指定一条 CMD 命令。
比如:CMD ["/bin/bash", "-l"]
注意,docker run 命令可以覆盖 CMD 指令。
(6)ENTRYPOINT:跟 CMD 指令类似,但是不容易被 docker run 命令覆盖。
比如:ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]
docker run 命令行中指定的任何参数都会被当做参数再次传递给 ENTRYPOINT。
同时使用 ENTRYPOINT 和 CMD,比如:
ENTRYPOINT ["/usr/sbin/nginx"]
CMD ["-h"]
$ docker run -d -p 80 --name static_web maping930883/static_web -g "daemon off;"
如果确实需要,可以通过 docker run 的 --entrypoint 参数覆盖 ENTRYPOINT 指令。
(7)WORKDIR:创建新容器时,在容器内部设置一个工作目录。ENTRYPOINT 或 CMD 指定的程序会在这个目录下执行。
比如:WORKDIR /opt/webapp
docker run 命令行中的 -w 参数可以覆盖工作目录
(8)ENV:在镜像构建过程中设置环境变量。
比如:ENV REFRESHED_AT  2016-12-31
docker run 命令行中的 -e 参数可以传递环境变量
比如:docker run -it -e "WEB_PORT=8080" ubuntu env
(9)USER:创建容器时,会以什么用户与运行。默认不指定会使用 root 用户。
(10)VOLUME:给基于镜像创建的容器添加卷。
比如:VOLUME ["/opt/project", "/data"] 指定多个卷。
docker run 命令行中的 -v 参数可以指定卷
比如:docker run -d -p 80 --name website -v $PWD/website:/var/www/html/website jamtur01/nginx nginx
一个卷可以存在于一个或多个容器内的指定目录,对数据提供持久化的功能:
  • 卷可以在容器间共享和重用。
  • 一个容器也可以不和其它容器共享卷。
  • 对卷的修改是立即生效的。
  • 对卷的修改不会对更新镜像产生影响。
  • 卷会一直存在直到没有任何容器使用它。
(11)ADD:把构建环境下的文件和目录复制到镜像中。
比如:ADD latest.tar.gz /var/www/wordpress/
(12)COPY:与 ADD 类似,但是文件源路径只能是与当前构建环境相对的文件或目录,不能复制该目录以外的任何文件。
如果目的位置不存在,Docker 会自动创建需要的目录结构。
(13)ONBUILD:为镜像添加触发器。当一个镜像被用作其它镜像的基础镜像时,比如从某些位置添加源代码,执行构建脚本等等。

4. Docker 是如何执行 Dockerfile 的?
(1)Docker 从基础镜像运行一个容器。
(2)执行一条指令,对容器做出修改。
(3)执行类似 docker commit 的操作,提交一个新的镜像层。
(4)执行 Dockerfile 中的下一条指令,直到所有指令都执行完毕。

Docker_004:使用 docker commit 命令构建 docker image

环境:MAC OS  X 10.12.1 + Docker 1.12.1

$ docker run -it ubuntu bash

root@524101a95912:/# apt-get update
root@524101a95912:/# apt-get -y install apache2
root@524101a95912:/# exit

$ docker commit 524101a95912 maping930883/apache2:webserver
注意,docker commit 只会提交差异部分,这使得该更新非常轻量。

$ docker images maping930883/apache2

$ docker inspect maping930883/apache2:webserver

$ docker run -it maping930883/apache2:webserver bash

实际使用中,一般不推荐使用 docker commit 方式构建镜像,而是推荐使用 Dockerfile 方式。

Docker_003:基本使用

环境:MAC OS  X 10.12.1 + Docker 1.12.1

1. 下载并运行 nginx image
$ docker pull nginx
$ docker images
$ docker run -d -p 80:80 --name webserver nginx
访问 http://localhost
$ docker ps
$ docker stop webserver
$ docker start webserver
$ docker ps
发现 Container ID 不变
$ docker rm -f webserver // 停止并删除容器 -f 表示强制删除正在运行的容器
$ docker rmi nginx // 删除 docker image
$ docker restart
会重新执行 docker run 的命令以及参数。

2. 下载并运行 ubuntu image
$ docker pull ubuntu
$ docker run -it ubuntu bash
$ docker attach < container id >
attach 到一个已经运行的容器的 stdin,然后进行命令执行的动作。
但是需要注意的是,如果从这个 stdin 中 exit,会导致容器的停止。

3. 在容器内部启动额外新进程
$ docker exec -it < container id >  bash
$ docker exec -d
< container id >  touch /etc/new_config_file

4. 创建守护式容器
$ docker run --name aofo -d ubuntu bash -c "while true; do echo hello world; sleep 1; done"
参数 -c 表示命令将以一个字符串读入
参数 -d 表示在后台执行一个进程
$ docker logs -ft aofo

参数 -f 表示跟踪日志,类似 tail -f 命令
参数 -t 表示打印日志的时间戳
$ docker top aofo // 查看容器里的运行进程
$ docker inspect aofo // 检视容器

5. 停止所有容器
$ for id in $(docker ps -q); do docker stop $id; done


6. 删除所有容器
$ for id in $(docker ps -aq); do docker rm $id; done


7. 删除所有本地的 docker image
$ for id in $(docker images -aq); do docker rmi $id; done
$ docker rmi `docker images -aq`


8. 删除所有本地没有 Tag 的 docker image
$ docker rmi $(docker images | grep none | awk '{ print $3}')


9. 检索 image
$ docker search < image name >


10. 显示一个 image 的历史
$ docker history < image name >
 

11. 显示 docker 系统信息
$ docker info

输出如下:
Containers: 24
 Running: 0
 Paused: 0
 Stopped: 24
Images: 158
Server Version: 1.12.5
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 347
 Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host null overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Security Options: seccomp
Kernel Version: 4.4.39-moby
Operating System: Alpine Linux v3.4
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 1.951 GiB
Name: moby
ID: KBCH:BGPS:SZRV:JLLM:YO3Y:UHAT:DXDV:UOQA:KXJK:RN25:YLV5:U2LZ
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): true
 File Descriptors: 16
 Goroutines: 27
 System Time: 2016-12-31T01:53:44.788500613Z
 EventsListeners: 1
No Proxy: localhost、*.local、169.254/16
Username: maping930883
Registry: https://index.docker.io/v1/
WARNING: No kernel memory limit support
Insecure Registries:
 172.30.0.0/16
 127.0.0.0/8
 

2016年10月27日星期四

Docker_002:MAC 下安装 Docker

环境:MAC OS X 10.12.1 + Docker 1.12

1. 下载
最新版下载地址:http://www.docker.com/products/docker#/mac

以前版下载地址:https://download.docker.com/mac/{{ beta | stable}}/{{ version }}.{{ build number }}/Docker.dmg
举例说明:
https://download.docker.com/mac/stable/1.12.6.14937/Docker.dmg
https://download.docker.com/mac/stable/1.13.1.15353/Docker.dmg

2. 安装
双击 Docker.dmg

3. 测试
$ docker --version
Docker version 1.12.1, build 6f9534c

$ docker-compose --version
docker-compose version 1.8.0, build f3628c7

$ docker-machine --version
docker-machine version 0.8.1, build 41b3b25

$ docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 1.12.1
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 0
 Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: null host bridge overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Security Options: seccomp
Kernel Version: 4.4.20-moby
Operating System: Alpine Linux v3.4
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 1.952 GiB
Name: moby
ID: 6KEA:LU3F:2SVP:FLWR:KXCH:25A7:KHTH:ZHJF:NKNU:EVYK:PUG6:GVIN
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): true
 File Descriptors: 16
 Goroutines: 27
 System Time: 2016-10-27T02:42:17.643481669Z
 EventsListeners: 1
No Proxy: localhost、*.local、169.254/16
Registry: https://index.docker.io/v1/
Insecure Registries:
 127.0.0.0/8

4. 运行 Hello World
$ 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/

5. Docker 镜像保存在哪里?
~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2

Docker_001:MAC 下卸载 boot2docker

环境:MAC OS X 10.12.1

准备重新学习 Docker,很久之前装过一个 Docker 以及 boot2docker,由于 Docker 已经很老旧了,并且 boot2docker 已经被废弃了,所以安装最新的 Docker 之前想先把旧的卸载干净。

在 root 用户下,执行 uninstall.sh 脚本,内容如下:

#!/bin/bash

# Uninstall Script

if [ "$(which boot2docker)" == "" ]; then
    echo "boot2docker does not exist on your machine!"
    exit 1
fi

if [ "${USER}" != "root" ]; then
    echo "$0 must be run as root!"
    exit 2
fi

echo "Stopping boot2docker processes..."
boot2docker stop && boot2docker delete

echo "Removing boot2docker executable..."
rm -f /usr/local/bin/boot2docker

echo "Removing boot2docker ISO and socket files..."
rm -rf ~/.boot2docker
rm -rf /usr/local/share/boot2docker

echo "Removing boot2docker SSH keys..."
rm -f ~/.ssh/id_boot2docker*

echo "Removing boot2docker OSX files..."
rm -f /private/var/db/receipts/io.boot2docker.*
rm -f /private/var/db/receipts/io.boot2dockeriso.*

echo "Removing Docker executable..."
rm -f /usr/local/bin/docker

echo "All Done!"


参考文献:
1. https://github.com/boot2docker/osx-installer

2016年10月23日星期日

MAC_044:离线安装ATOM 插件

环境:MAC OS 10.12

之所以使用离线安装,是因为有些插件直接安装需要翻墙很不方便。

1. 安装 atom-beautify
cd ~/.atom/packages
git clone https://github.com/Glavin001/atom-beautify.git
cd atom-beautify
npm install

2. 安装 atom-ternjs
cd ~/.atom/packages
git clone git@github.com:tststs/atom-ternjs.git
cd atom-ternjs
npm install

NodeJS_001:MAC 下安装

环境:MAC OS X10.12

1. 先安装 Homebrew
请参考《安装Homebrew》。

2. 安装 node
$ brew install node
$ node -v

3. 测试 node

(1) vim test.js
const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World\n');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});


(2) node test.js

(3) curl http://localhost:3000


2016年10月18日星期二

Tips_027:解决连接VPN后,Firefox无法上网的问题

使用 Cisco AnyConnect 连接 VPN 后,发现 Firefox 不能上网了,而其它浏览器都没有问题。
几番折腾后,终于看见了久违的博客。

1. 代理选择“自动检测此网络的代理设置”,并且不要勾选“远程 DNS”



2. 禁用其它的代理插件

2016年10月15日星期六

JBDS_002:安装和配置 JBoss Developer Studio 9.1.0

1. 下载
地址: access.redhat.com
介质:jboss-devstudio-9.1.0.GA-installer-standalone.jar

2. 安装
java -jar jboss-devstudio-9.1.0.GA-installer-standalone.jar
注意,JBDS 9.1.0 安装时,需要指定 JDK 8。
也就是说,JBDS 9.1.0 运行时需要 JDK 8,但是开发项目时,可以使用 JDK 7/6。

3. 离线安装 JBoss Developer Studio Integration Stack 9.0.2.GA Update Site

3.1 下载
地址:https://devstudio.redhat.com/9.0/stable/updates/integration-stack/
介质:devstudio-integration-stack-9.0.2.GA-updatesite.zip

3.2 安装
(1)打开 JBDS 9.1.0
(2)点击 Help -> Install New Software
(3)点击 Work with 旁边的 Add,点击 Archive,选择 devstudio-integration-stack-9.0.2.GA-updatesite.zip
(4)开发 JBoss Fuse,勾选 JBoss Fuse Development
          开发 JBoss BRMS 和 JBoss BPM Suite,勾选 JBoss Business and Rules

4. 在线安装 JBoss Developer Studio Integration Stack 9.0.2.GA Update Site
(1)打开 JBDS 9.1.0
(2)点击 Redhat Central
(3)点击 Software/Update
(4)开发 JBoss Fuse,勾选 JBoss Fuse Development
          开发 JBoss BRMS 和 JBoss BPM Suite,勾选 JBoss Business and Rules
注意,在线安装可能很慢。

5. 一次性安装 JBoss Developer Studio 9.1.0 和 JBoss Developer Studio Integration Stack 9.0.2.GA Update Site

5.1 下载
地址: access.redhat.com
介质:devstudio-integration-stack-9.0.2.GA-standalone-installer.jar

5.2 安装
java -jar devstudio-integration-stack-9.0.2.GA-standalone-installer.jar
注意,JBDS 9.1.0 安装时,需要指定 JDK 8。
也就是说,JBDS 9.1.0 运行时需要 JDK 8,但是开发项目时,可以使用 JDK 7/6。

2016年10月12日星期三

Tools_030:很好用的文件、目录比较工具:Beyond Compare

下载地址:http://www.scootersoftware.com/download.php

2016年10月9日星期日

Nexus_011:Nexus 3 安装与配置

环境:MAC OS X 10.12 + JDK 1.8 + Maven 3.3.9 + Nexus 3.3

1. 下载与安装
下载地址:http://www.sonatype.org/nexus/
下载 Nexus Repository OSS(2018-12-10 更新),Nexus 分为社区版和专业版,这里使用社区版。

下载最新版:nexus-3.3.1-01-mac.tgz

tar xzvf nexus-3.3.1-01-mac.tgz
ln -s nexus-3.3.1-01 nexus3
cd nexus3/bin

2. 配置
(1)修改默认 JDK 配置,注意 Nexus3 必须使用 JDK8
vi nexus
INSTALL4J_JAVA_HOME_OVERRIDE=/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home
如果和 JAVA_HOME 环境变量一致,此步也可以不做。
(2)修改默认端口
vi nexus3/etc/nexus-default.properties
application-port=8081

3. 启动/停止
 ./nexus start/stop
访问 http://localhost:8081 admin/admin123


参考文献:
1. http://www.cnblogs.com/wzy5223/p/5389546.html
2. http://www.cnblogs.com/qq27271609/p/5497412.html
3. http://www.cnblogs.com/qq27271609/p/5497793.html
4. http://www.cnblogs.com/qq27271609/p/5497815.html

Nexus_010:Nexus 2 升级

由于 Nexus 2 配置和数据分离,因此升级过程相对简单。

1. 备份 sonatype-work/nexus/conf 目录。
2. 在旧版本的同级目录下,解压新版本,即解压后的新 Nexus 版本和 sonatype-work 目录同级。
3. 修改软连接指向。

参考文献:
1. https://support.sonatype.com/hc/en-us/articles/213464198-How-do-I-upgrade-Nexus-
2. https://yufan.me/upgrade-nexus-from-old-install/

2016年10月2日星期日

Maven_008:mvn archetype:generate 命令执行不结束问题

运行如下 mvn archetype:generate 命令时,
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-webapp -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
发现在输出
[INFO] Generating project in Batch mode
这一行后,就停住了。

提示增加 -X 进行 DEBUG,于是增加 -X
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-webapp -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false -X
发现是在这里
[DEBUG] Searching for remote catalog: http://repo.maven.apache.org/maven2/archetype-catalog.xml
停住了。
后来发现,耐心等一会儿,也是可以结束的。

解决方式一:
增加 -DarchetypeCatalog=internal 告诉 Maven 不要从远程库下载 archetype catalog。
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-webapp -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false -DarchetypeCatalog=internal

解决方式二:
访问 http://repo.maven.apache.org/maven2/archetype-catalog.xml,并另存为 archetype-catalog.xml,复制到 ~/.m2/ 目录下。