diff --git a/4/README.md b/4/README.md index b5bdb90..4822e43 100644 --- a/4/README.md +++ b/4/README.md @@ -166,7 +166,7 @@ $ sudo docker run -it jamtur01/test /bin/ps ENTRYPOINT ["/usr/sbin/nginx"] ``` -讲`-g "daemon off;"`作为参数传递给ENTRYPOINT指令 +将`-g "daemon off;"`作为参数传递给ENTRYPOINT指令 ``` $ sudo docker run -it jamtur01/static_web -g "daemon off;" ``` @@ -280,5 +280,5 @@ $ sudo docker rmi jamtur01/static_web 删除所有镜像 ``` -$ sudo docker rmi `sudo docker ps imgages -a -q` -``` \ No newline at end of file +$ sudo docker rmi `sudo docker imgages -a -q` +``` diff --git a/5/README.md b/5/README.md index 326a329..21e543b 100644 --- a/5/README.md +++ b/5/README.md @@ -14,6 +14,19 @@ $ wget http://raw.githubusercontent.com/jamtur01/dockerbook-code/master/code/5/s $ cd .. ``` +Dockerfile 内容 + +``` +FROM ubuntu:14.04 +MAINTAINER James Turnbull "james@example.com" +ENV REFRESHED_AT 2014-06-01 +RUN apt-get -yqq update && apt-get -yqq install nginx +RUN mkdir -p /var/www/html/website +ADD nginx/global.conf /etc/nginx/conf.d/ +ADD nginx/nginx.conf /etc/nginx/nginx.conf +EXPOSE 80 +``` + 构建新的Nginx镜像 ``` $ sudo docker build -t jamtur01/nginx . @@ -64,6 +77,36 @@ $ mkdir sinatra && cd sinatra $ touch Dockerfile ``` +Dockerfile 内容 + +``` +FROM ubuntu:14.04 +MAINTAINER James Turnbull "james@example.com" +ENV REFRESHED_AT 2014-06-01 + +RUN apt-get -yqq update && apt-get -yqq install wget curl gnupg2 libcurl3 build-essential redis-tools +RUN apt-get install -y --force-yes zlib1g-dev libssl-dev libreadline-dev libyaml-dev libxml2-dev libxslt-dev + +RUN cd /tmp +COPY ruby-2.5.0.tar.gz /tmp/ +#RUN wget http://ftp.ruby-lang.org/pub/ruby/2.5/ruby-2.5.0.tar.gz +#RUN wget http://mirrors.nju.edu.cn/ruby/2.5/ruby-2.5.0.tar.gz +RUN tar -xvzf /tmp/ruby-2.5.0.tar.gz -C /tmp/ +RUN cd /tmp/ruby-2.5.0/ && ./configure --prefix=/usr/local; make; make install +RUN ruby -v + +RUN ln -sf /usr/local/bin/ruby /usr/bin/ruby + +RUN gem install --no-rdoc --no-ri sinatra json redis + +RUN mkdir -p /opt/webapp + +EXPOSE 4567 + +CMD [ "/opt/webapp/bin/webapp" ] +``` + + 构建新的Sinatra镜像 ``` $ sudo docker build -t jamtur01/sinatra . @@ -133,6 +176,20 @@ $ mkdir sinatra/redis && cd sinatra/redis $ touch Dockerfile ``` +Dockerfile 内容 +``` +FROM ubuntu:14.04 +MAINTAINER James Turnbull "james@example.com" +ENV REFRESHED_AT 2014-06-01 + +RUN apt-get -yqq update && apt-get -yqq install redis-server redis-tools +RUN sysctl -w vm.overcommit_memory=1 + +EXPOSE 6379 + +ENTRYPOINT ["/usr/bin/redis-server"] +``` + 构建Redis镜像 ``` $ sudo docker build -t jamtur01/redis . @@ -207,8 +264,9 @@ $ sudo docker run -d --net=app --name db jamtur01/redis 链接redis容器 ``` $ sudo docker run -p 4567 \ - --net=app --name webapp \ - -v $PWD/webapp_redis:/opt/webapp jamtur01/sinatra + --net=app --name webapp -t -i \ + -v $PWD/webapp_redis:/opt/webapp jamtur01/sinatra \ + /bin/bash ``` ### Docker用于持续集成 @@ -245,4 +303,29 @@ $ sudo docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword #### 创建多配置作业 -创建`Docker_matrix_job`多配置项目,选择Git并指定测试仓库`https://github.com/jamtur01/docker-jenkins-sample.git`,点击`Add Axis`按钮,并选择`User-defined Axis`,定义名字为`OS`,值为`centos debian ubuntu`,选择`Delete workspace before build starts`在构建前删除工作空间,点击`Add Build Step`增加一个构建步骤,选择`Execute shell`,使用定义的脚本来启动测试Docker,点击`Add post-build action`加入构建后的动作,加入一个`Publish JUnit test result report`公布JUnit测试结果报告,指定`Test report XMLs`测试报告的XML文件为`spec/reports/*.xml`,最后点击Save保存作业 \ No newline at end of file +创建`Docker_matrix_job`多配置项目,选择Git并指定测试仓库`https://github.com/jamtur01/docker-jenkins-sample.git`,点击`Add Axis`按钮,并选择`User-defined Axis`,定义名字为`OS`,值为`centos debian ubuntu`,选择`Delete workspace before build starts`在构建前删除工作空间,点击`Add Build Step`增加一个构建步骤,选择`Execute shell`,使用定义的脚本来启动测试Docker,点击`Add post-build action`加入构建后的动作,加入一个`Publish JUnit test result report`公布JUnit测试结果报告,指定`Test report XMLs`测试报告的XML文件为`spec/reports/*.xml`,最后点击Save保存作业 + + +### FAQ + + - Q: + +``` +Step 12/15 : RUN gem install --no-rdoc --no-ri jekyll + ---> Running in badbe1b0e565 +ERROR: Loading command: install (LoadError) + cannot load such file -- zlib +ERROR: While executing gem ... (NoMethodError) + undefined method `invoke_with_build_args' for nil:NilClass +The command '/bin/sh -c gem install --no-rdoc --no-ri jekyll' returned a non-zero code: 1 +``` + + - A: + + ``` + Dockerfile 中增加 + RUN apt-get install -y --force-yes zlib1g-dev libssl-dev libreadline-dev libyaml-dev libxml2-dev libxslt-dev + ``` + + + diff --git a/6/README.md b/6/README.md index 9ea034f..d7831fc 100644 --- a/6/README.md +++ b/6/README.md @@ -54,7 +54,7 @@ $ rm -rf james_blog/.git 创建Jekyll容器 ``` -$ sudo docker run -v james_blog:/data --name james_blog jamtur01/jekyll +$ sudo docker run -v $PWD/james_blog:/data --name james_blog jamtur01/jekyll ``` 卷的几个有用的特征 @@ -199,9 +199,10 @@ $ sudo docker port tprov 创建Node.js的Dockerfile ``` -$ mkdir -p nodejs/nodeapp && cd nodejs +$ mkdir -p nodejs/nodeapp && cd nodejs/nodeapp $ wget https://raw.githubusercontent.com/jamtur01/dockerbook-code/master/code/6/node/nodejs/nodeapp/package.json -P nodeapp $ wget https://raw.githubusercontent.com/jamtur01/dockerbook-code/master/code/6/node/nodejs/nodeapp/server.js -P nodeapp +$ cd .. $ touch Dockerfile ``` @@ -273,7 +274,7 @@ $ sudo docker run -it --rm --volumes-from redis_primary ubuntu cat /var/log/redi 运行第一个Redis副本容器 ``` -$ sudo docker run -d -h redis_repilica1 --name redis_repilica1 --net express jamtur01/redis_replica +$ sudo docker run -d -h redis_replica1 --name redis_replica1 --net express jamtur01/redis_replica ``` 读取Redis副本容器的日志 @@ -352,7 +353,26 @@ $ sudo docker logs -f logstash $ sudo docker kill -s ``` +安装 nsenter +``` +$ sudo docker run -v /usr/local/bin/:/target jpetazzo/nsenter +``` + 获取容器的进程ID ``` $ sudo docker inspect --format '{{.State.Pid}}' -``` \ No newline at end of file +``` + +使用 nsenter 进入容器 +``` +$ sudo nsenter --target $PID --mount --uts --ipc --net --pid +``` + +使用 nsenter 在容器内执行命令 +``` +sudo nsenter --target $PID --mount --uts --ipc --net --pid ls +``` + + + + diff --git a/8/README.md b/8/README.md index c45838f..f0029cc 100644 --- a/8/README.md +++ b/8/README.md @@ -83,7 +83,7 @@ http://docker.example.com:2375/containers/create \ 通过API创建容器,提供更多配置 ``` $ curl -X POST -H "Content-Type: application/json" \ -http://docker.example.com:2375/containers/create?name=jekyll" \ +"http://docker.example.com:2375/containers/create?name=jekyll" \ -d '{ "Image": "jamtur01/jekyll", "Hostname": "jekyll" @@ -142,6 +142,8 @@ $ sudo openssl genrsa -des3 -out server-key.pem $ sudo openssl req -new -key server-key.pem -out server.csr ``` +注意需要设置 CN (Common Name) 为 **docker.example.com** + 对CSR进行签名 ``` $ sudo openssl x509 -req -days 365 -in server.csr -CA ca.pem \ @@ -230,4 +232,4 @@ $ cp client-cert.pem ~/.docker/cert.pem 测试TLS连接 ``` $ sudo docker -H docker.example.com:2376 --tlsverify info -``` \ No newline at end of file +```