Merge pull request #204 from khs1994/master

Fix #203 #206 #208 #209
pull/210/head
Baohua Yang 2017-10-31 19:11:08 -05:00 committed by GitHub
commit 096350920c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
42 changed files with 348 additions and 1122 deletions

View File

@ -13,7 +13,7 @@
* pdf 版本 [下载](https://www.gitbook.com/download/pdf/book/yeasy/docker_practice) * pdf 版本 [下载](https://www.gitbook.com/download/pdf/book/yeasy/docker_practice)
* epub 版本 [下载](https://www.gitbook.com/download/epub/book/yeasy/docker_practice) * epub 版本 [下载](https://www.gitbook.com/download/epub/book/yeasy/docker_practice)
Docker 自身仍在快速发展中,生态环境也在蓬勃成长。欢迎参与维护项目:[如何贡献](contribute.md)。 Docker 自身仍在快速发展中,生态环境也在蓬勃成长。建议初学者使用 Linux 上最新版的 Docker v17.10.0)进行学习实践。欢迎参与维护项目:[如何贡献](contribute.md)。
* [修订记录](revision.md) * [修订记录](revision.md)
* [贡献者名单](https://github.com/yeasy/docker_practice/graphs/contributors) * [贡献者名单](https://github.com/yeasy/docker_practice/graphs/contributors)

View File

@ -82,7 +82,7 @@
* [容器格式](underly/container_format.md) * [容器格式](underly/container_format.md)
* [网络](underly/network.md) * [网络](underly/network.md)
* [Docker 三剑客之 Compose 项目](compose/README.md) * [Docker 三剑客之 Compose 项目](compose/README.md)
* [简介](compose/intro.md) * [简介](compose/introduction.md)
* [安装与卸载](compose/install.md) * [安装与卸载](compose/install.md)
* [使用](compose/usage.md) * [使用](compose/usage.md)
* [命令说明](compose/commands.md) * [命令说明](compose/commands.md)

View File

@ -15,46 +15,4 @@ bash-4.2#
### Dockerfile ### Dockerfile
#### CentOS 5 版本 请到 https://github.com/docker-library/docs/tree/master/centos 查看。
```
FROM scratch
MAINTAINER The CentOS Project <cloud-ops@centos.org>
ADD c5-docker.tar.xz /
LABEL name="CentOS Base Image" \
vendor="CentOS" \
license="GPLv2" \
build-date="2016-03-31"
# Default command
CMD ["/bin/bash"]
```
#### CentOS 6 版本
```
FROM scratch
MAINTAINER https://github.com/CentOS/sig-cloud-instance-images
ADD centos-6-docker.tar.xz /
LABEL name="CentOS Base Image" \
vendor="CentOS" \
license="GPLv2" \
build-date="20160729"
CMD ["/bin/bash"]
```
#### CentOS 7 版本
```
FROM scratch
MAINTAINER https://github.com/CentOS/sig-cloud-instance-images
ADD centos-7-docker.tar.xz /
LABEL name="CentOS Base Image" \
vendor="CentOS" \
license="GPLv2" \
build-date="20160729"
CMD ["/bin/bash"]
```

View File

@ -26,239 +26,4 @@ $ docker run -it --link some-mongo:mongo --rm mongo sh -c 'exec mongo "$MONGO_PO
### Dockerfile ### Dockerfile
#### 2.6 版本 请到 https://github.com/docker-library/docs/tree/master/mongo 查看。
```
FROM debian:wheezy
# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
RUN groupadd -r mongodb && useradd -r -g mongodb mongodb
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
ca-certificates wget \
numactl \
&& rm -rf /var/lib/apt/lists/*
# grab gosu for easy step-down from root
ENV GOSU_VERSION 1.7
RUN set -x \
&& wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)" \
&& wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc" \
&& export GNUPGHOME="$(mktemp -d)" \
&& gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \
&& gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \
&& rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc \
&& chmod +x /usr/local/bin/gosu \
&& gosu nobody true
ENV MONGO_VERSION 2.6.12
RUN set -x \
&& wget -O mongo.tgz "https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-$MONGO_VERSION.tgz" \
&& wget -O mongo.tgz.sig "https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-$MONGO_VERSION.tgz.sig" \
&& export GNUPGHOME="$(mktemp -d)" \
&& gpg --keyserver ha.pool.sks-keyservers.net --recv-keys DFFA3DCF326E302C4787673A01C4E7FAAAB2461C \
&& gpg --batch --verify mongo.tgz.sig mongo.tgz \
&& rm -r "$GNUPGHOME" mongo.tgz.sig \
&& tar -xvf mongo.tgz -C /usr/local --strip-components=1 \
&& rm mongo.tgz
RUN mkdir -p /data/db /data/configdb \
&& chown -R mongodb:mongodb /data/db /data/configdb
VOLUME /data/db /data/configdb
COPY docker-entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
EXPOSE 27017
CMD ["mongod"]
```
#### 3.0 版本
```
FROM debian:wheezy
# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
RUN groupadd -r mongodb && useradd -r -g mongodb mongodb
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
numactl \
&& rm -rf /var/lib/apt/lists/*
# grab gosu for easy step-down from root
ENV GOSU_VERSION 1.7
RUN set -x \
&& apt-get update && apt-get install -y --no-install-recommends ca-certificates wget && rm -rf /var/lib/apt/lists/* \
&& wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)" \
&& wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc" \
&& export GNUPGHOME="$(mktemp -d)" \
&& gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \
&& gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \
&& rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc \
&& chmod +x /usr/local/bin/gosu \
&& gosu nobody true \
&& apt-get purge -y --auto-remove ca-certificates wget
# gpg: key 7F0CEB10: public key "Richard Kreuter <richard@10gen.com>" imported
RUN apt-key adv --keyserver ha.pool.sks-keyservers.net --recv-keys 492EAFE8CD016A07919F1D2B9ECBEC467F0CEB10
ENV MONGO_MAJOR 3.0
ENV MONGO_VERSION 3.0.12
RUN echo "deb http://repo.mongodb.org/apt/debian wheezy/mongodb-org/$MONGO_MAJOR main" > /etc/apt/sources.list.d/mongodb-org.list
RUN set -x \
&& apt-get update \
&& apt-get install -y \
mongodb-org=$MONGO_VERSION \
mongodb-org-server=$MONGO_VERSION \
mongodb-org-shell=$MONGO_VERSION \
mongodb-org-mongos=$MONGO_VERSION \
mongodb-org-tools=$MONGO_VERSION \
&& rm -rf /var/lib/apt/lists/* \
&& rm -rf /var/lib/mongodb \
&& mv /etc/mongod.conf /etc/mongod.conf.orig
RUN mkdir -p /data/db /data/configdb \
&& chown -R mongodb:mongodb /data/db /data/configdb
VOLUME /data/db /data/configdb
COPY docker-entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
EXPOSE 27017
CMD ["mongod"]
```
#### 3.2 版本
```
FROM debian:wheezy
# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
RUN groupadd -r mongodb && useradd -r -g mongodb mongodb
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
numactl \
&& rm -rf /var/lib/apt/lists/*
# grab gosu for easy step-down from root
ENV GOSU_VERSION 1.7
RUN set -x \
&& apt-get update && apt-get install -y --no-install-recommends ca-certificates wget && rm -rf /var/lib/apt/lists/* \
&& wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)" \
&& wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc" \
&& export GNUPGHOME="$(mktemp -d)" \
&& gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \
&& gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \
&& rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc \
&& chmod +x /usr/local/bin/gosu \
&& gosu nobody true \
&& apt-get purge -y --auto-remove ca-certificates wget
# pub 4096R/AAB2461C 2014-02-25 [expires: 2016-02-25]
# Key fingerprint = DFFA 3DCF 326E 302C 4787 673A 01C4 E7FA AAB2 461C
# uid MongoDB 2.6 Release Signing Key <packaging@mongodb.com>
#
# pub 4096R/EA312927 2015-10-09 [expires: 2017-10-08]
# Key fingerprint = 42F3 E95A 2C4F 0827 9C49 60AD D68F A50F EA31 2927
# uid MongoDB 3.2 Release Signing Key <packaging@mongodb.com>
#
ENV GPG_KEYS \
DFFA3DCF326E302C4787673A01C4E7FAAAB2461C \
42F3E95A2C4F08279C4960ADD68FA50FEA312927
RUN set -ex \
&& for key in $GPG_KEYS; do \
apt-key adv --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \
done
ENV MONGO_MAJOR 3.2
ENV MONGO_VERSION 3.2.8
RUN echo "deb http://repo.mongodb.org/apt/debian wheezy/mongodb-org/$MONGO_MAJOR main" > /etc/apt/sources.list.d/mongodb-org.list
RUN set -x \
&& apt-get update \
&& apt-get install -y \
mongodb-org=$MONGO_VERSION \
mongodb-org-server=$MONGO_VERSION \
mongodb-org-shell=$MONGO_VERSION \
mongodb-org-mongos=$MONGO_VERSION \
mongodb-org-tools=$MONGO_VERSION \
&& rm -rf /var/lib/apt/lists/* \
&& rm -rf /var/lib/mongodb \
&& mv /etc/mongod.conf /etc/mongod.conf.orig
RUN mkdir -p /data/db /data/configdb \
&& chown -R mongodb:mongodb /data/db /data/configdb
VOLUME /data/db /data/configdb
COPY docker-entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
EXPOSE 27017
CMD ["mongod"]
```
#### 3.3 版本
```
FROM debian:jessie
# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
RUN groupadd -r mongodb && useradd -r -g mongodb mongodb
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
numactl \
&& rm -rf /var/lib/apt/lists/*
# grab gosu for easy step-down from root
ENV GOSU_VERSION 1.7
RUN set -x \
&& apt-get update && apt-get install -y --no-install-recommends ca-certificates wget && rm -rf /var/lib/apt/lists/* \
&& wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)" \
&& wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc" \
&& export GNUPGHOME="$(mktemp -d)" \
&& gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \
&& gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \
&& rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc \
&& chmod +x /usr/local/bin/gosu \
&& gosu nobody true \
&& apt-get purge -y --auto-remove ca-certificates wget
# pub 4096R/A15703C6 2016-01-11 [expires: 2018-01-10]
# Key fingerprint = 0C49 F373 0359 A145 1858 5931 BC71 1F9B A157 03C6
# uid MongoDB 3.4 Release Signing Key <packaging@mongodb.com>
RUN apt-key adv --keyserver ha.pool.sks-keyservers.net --recv-keys 0C49F3730359A14518585931BC711F9BA15703C6
ENV MONGO_MAJOR 3.3
ENV MONGO_VERSION 3.3.10
RUN echo "deb http://repo.mongodb.org/apt/debian jessie/mongodb-org/$MONGO_MAJOR main" > /etc/apt/sources.list.d/mongodb-org.list
RUN set -x \
&& apt-get update \
&& apt-get install -y \
mongodb-org-unstable=$MONGO_VERSION \
mongodb-org-unstable-server=$MONGO_VERSION \
mongodb-org-unstable-shell=$MONGO_VERSION \
mongodb-org-unstable-mongos=$MONGO_VERSION \
mongodb-org-unstable-tools=$MONGO_VERSION \
&& rm -rf /var/lib/apt/lists/* \
&& rm -rf /var/lib/mongodb \
&& mv /etc/mongod.conf /etc/mongod.conf.orig
RUN mkdir -p /data/db /data/configdb \
&& chown -R mongodb:mongodb /data/db /data/configdb
VOLUME /data/db /data/configdb
COPY docker-entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
EXPOSE 27017
CMD ["mongod"]
```

View File

@ -23,104 +23,5 @@ $ docker run -it --link some-mysql:mysql --rm mysql sh -c 'exec mysql -h"$MYSQL_
``` ```
### Dockerfile ### Dockerfile
#### 5.6 版本
```
FROM debian:wheezy
# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
RUN groupadd -r mysql && useradd -r -g mysql mysql
# FATAL ERROR: please install the following Perl modules before executing /usr/local/mysql/scripts/mysql_install_db:
# File::Basename
# File::Copy
# Sys::Hostname
# Data::Dumper
RUN apt-get update && apt-get install -y perl --no-install-recommends && rm -rf /var/lib/apt/lists/*
# mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory
RUN apt-get update && apt-get install -y libaio1 && rm -rf /var/lib/apt/lists/*
# gpg: key 5072E1F5: public key "MySQL Release Engineering <mysql-build@oss.oracle.com>" imported
RUN gpg --keyserver pgp.mit.edu --recv-keys A4A9406876FCBD3C456770C88C718D3B5072E1F5
ENV MYSQL_MAJOR 5.6
ENV MYSQL_VERSION 5.6.20
# note: we're pulling the *.asc file from mysql.he.net instead of dev.mysql.com because the official mirror 404s that file for whatever reason - maybe it's at a different path?
RUN apt-get update && apt-get install -y curl --no-install-recommends && rm -rf /var/lib/apt/lists/* \
&& curl -SL "http://dev.mysql.com/get/Downloads/MySQL-$MYSQL_MAJOR/mysql-$MYSQL_VERSION-linux-glibc2.5-x86_64.tar.gz" -o mysql.tar.gz \
&& curl -SL "http://mysql.he.net/Downloads/MySQL-$MYSQL_MAJOR/mysql-$MYSQL_VERSION-linux-glibc2.5-x86_64.tar.gz.asc" -o mysql.tar.gz.asc \
&& apt-get purge -y --auto-remove curl \
&& gpg --verify mysql.tar.gz.asc \
&& mkdir /usr/local/mysql \
&& tar -xzf mysql.tar.gz -C /usr/local/mysql --strip-components=1 \
&& rm mysql.tar.gz* \
&& rm -rf /usr/local/mysql/mysql-test /usr/local/mysql/sql-bench \
&& rm -rf /usr/local/mysql/bin/*-debug /usr/local/mysql/bin/*_embedded \
&& find /usr/local/mysql -type f -name "*.a" -delete \
&& apt-get update && apt-get install -y binutils && rm -rf /var/lib/apt/lists/* \
&& { find /usr/local/mysql -type f -executable -exec strip --strip-all '{}' + || true; } \
&& apt-get purge -y --auto-remove binutils
ENV PATH $PATH:/usr/local/mysql/bin:/usr/local/mysql/scripts
WORKDIR /usr/local/mysql
VOLUME /var/lib/mysql
COPY docker-entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
EXPOSE 3306
CMD ["mysqld", "--datadir=/var/lib/mysql", "--user=mysql"]
```
#### 5.7 版本
```
FROM debian:wheezy
# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
RUN groupadd -r mysql && useradd -r -g mysql mysql
# FATAL ERROR: please install the following Perl modules before executing /usr/local/mysql/scripts/mysql_install_db:
# File::Basename
# File::Copy
# Sys::Hostname
# Data::Dumper
RUN apt-get update && apt-get install -y perl --no-install-recommends && rm -rf /var/lib/apt/lists/*
# mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory
RUN apt-get update && apt-get install -y libaio1 && rm -rf /var/lib/apt/lists/*
# gpg: key 5072E1F5: public key "MySQL Release Engineering <mysql-build@oss.oracle.com>" imported
RUN gpg --keyserver pgp.mit.edu --recv-keys A4A9406876FCBD3C456770C88C718D3B5072E1F5
ENV MYSQL_MAJOR 5.7
ENV MYSQL_VERSION 5.7.4-m14
# note: we're pulling the *.asc file from mysql.he.net instead of dev.mysql.com because the official mirror 404s that file for whatever reason - maybe it's at a different path?
RUN apt-get update && apt-get install -y curl --no-install-recommends && rm -rf /var/lib/apt/lists/* \
&& curl -SL "http://dev.mysql.com/get/Downloads/MySQL-$MYSQL_MAJOR/mysql-$MYSQL_VERSION-linux-glibc2.5-x86_64.tar.gz" -o mysql.tar.gz \
&& curl -SL "http://mysql.he.net/Downloads/MySQL-$MYSQL_MAJOR/mysql-$MYSQL_VERSION-linux-glibc2.5-x86_64.tar.gz.asc" -o mysql.tar.gz.asc \
&& apt-get purge -y --auto-remove curl \
&& gpg --verify mysql.tar.gz.asc \
&& mkdir /usr/local/mysql \
&& tar -xzf mysql.tar.gz -C /usr/local/mysql --strip-components=1 \
&& rm mysql.tar.gz* \
&& rm -rf /usr/local/mysql/mysql-test /usr/local/mysql/sql-bench \
&& rm -rf /usr/local/mysql/bin/*-debug /usr/local/mysql/bin/*_embedded \
&& find /usr/local/mysql -type f -name "*.a" -delete \
&& apt-get update && apt-get install -y binutils && rm -rf /var/lib/apt/lists/* \
&& { find /usr/local/mysql -type f -executable -exec strip --strip-all '{}' + || true; } \
&& apt-get purge -y --auto-remove binutils
ENV PATH $PATH:/usr/local/mysql/bin:/usr/local/mysql/scripts
WORKDIR /usr/local/mysql
VOLUME /var/lib/mysql
COPY docker-entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
EXPOSE 3306
CMD ["mysqld", "--datadir=/var/lib/mysql", "--user=mysql"]
```
请到 https://github.com/docker-library/docs/tree/master/mysql 查看

View File

@ -37,67 +37,5 @@ docker run --name some-nginx -v /some/nginx.conf:/etc/nginx/nginx.conf:ro -d ngi
使用配置文件时,为了在容器中正常运行,需要保持 `daemon off;` 使用配置文件时,为了在容器中正常运行,需要保持 `daemon off;`
### Dockerfile ### Dockerfile
#### stable 版本
```
FROM debian:jessie
MAINTAINER NGINX Docker Maintainers "docker-maint@nginx.com"
ENV NGINX_VERSION 1.10.1-1~jessie
RUN apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 \
&& echo "deb http://nginx.org/packages/debian/ jessie nginx" >> /etc/apt/sources.list \
&& apt-get update \
&& apt-get install --no-install-recommends --no-install-suggests -y \
ca-certificates \
nginx=${NGINX_VERSION} \
nginx-module-xslt \
nginx-module-geoip \
nginx-module-image-filter \
nginx-module-perl \
nginx-module-njs \
gettext-base \
&& rm -rf /var/lib/apt/lists/*
# forward request and error logs to docker log collector
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
&& ln -sf /dev/stderr /var/log/nginx/error.log
EXPOSE 80 443
CMD ["nginx", "-g", "daemon off;"]
```
#### 1.11.x 版本
```
FROM debian:jessie
MAINTAINER NGINX Docker Maintainers "docker-maint@nginx.com"
ENV NGINX_VERSION 1.11.1-1~jessie
RUN apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 \
&& echo "deb http://nginx.org/packages/mainline/debian/ jessie nginx" >> /etc/apt/sources.list \
&& apt-get update \
&& apt-get install --no-install-recommends --no-install-suggests -y \
ca-certificates \
nginx=${NGINX_VERSION} \
nginx-module-xslt \
nginx-module-geoip \
nginx-module-image-filter \
nginx-module-perl \
nginx-module-njs \
gettext-base \
&& rm -rf /var/lib/apt/lists/*
# forward request and error logs to docker log collector
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
&& ln -sf /dev/stderr /var/log/nginx/error.log
EXPOSE 80 443
CMD ["nginx", "-g", "daemon off;"]
```
请到 https://github.com/docker-library/docs/tree/master/nginx 查看。

View File

@ -28,124 +28,4 @@ $ docker run -it --rm --name my-running-script -v "$(pwd)":/usr/src/myapp -w /us
### Dockerfile ### Dockerfile
#### 0.10 版本 请到 https://github.com/docker-library/docs/tree/master/node 查看。
```
FROM buildpack-deps
RUN apt-get update && apt-get install -y \
ca-certificates \
curl
# verify gpg and sha256: http://nodejs.org/dist/v0.10.31/SHASUMS256.txt.asc
# gpg: aka "Timothy J Fontaine (Work) <tj.fontaine@joyent.com>"
RUN gpg --keyserver pgp.mit.edu --recv-keys 7937DFD2AB06298B2293C3187D33FF9D0246406D
ENV NODE_VERSION 0.10.32
RUN curl -SLO "http://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.gz" \
&& curl -SLO "http://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \
&& gpg --verify SHASUMS256.txt.asc \
&& grep " node-v$NODE_VERSION-linux-x64.tar.gz\$" SHASUMS256.txt.asc | sha256sum -c - \
&& tar -xzf "node-v$NODE_VERSION-linux-x64.tar.gz" -C /usr/local --strip-components=1 \
&& rm "node-v$NODE_VERSION-linux-x64.tar.gz" SHASUMS256.txt.asc
CMD [ "node" ]
```
#### 4.x 版本
```
FROM buildpack-deps:jessie
# gpg keys listed at https://github.com/nodejs/node
RUN set -ex \
&& for key in \
9554F04D7259F04124DE6B476D5A82AC7E37093B \
94AE36675C464D64BAFA68DD7434390BDBE9B9C5 \
0034A06D9D9B0064CE8ADF6BF1747F4AD2306D93 \
FD3A5288F042B6850C66B31F09FE44734EB7990E \
71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 \
DD8F2338BAE7501E3DD5AC78C273792F7D83545D \
B9AE9905FFD7803F25714661B63B535A4C206CA9 \
C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 \
; do \
gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \
done
ENV NPM_CONFIG_LOGLEVEL info
ENV NODE_VERSION 4.4.7
RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
&& curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \
&& gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \
&& grep " node-v$NODE_VERSION-linux-x64.tar.xz\$" SHASUMS256.txt | sha256sum -c - \
&& tar -xJf "node-v$NODE_VERSION-linux-x64.tar.xz" -C /usr/local --strip-components=1 \
&& rm "node-v$NODE_VERSION-linux-x64.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt
CMD [ "node" ]
```
#### 5.x 版本
```
FROM buildpack-deps:jessie
# gpg keys listed at https://github.com/nodejs/node
RUN set -ex \
&& for key in \
9554F04D7259F04124DE6B476D5A82AC7E37093B \
94AE36675C464D64BAFA68DD7434390BDBE9B9C5 \
0034A06D9D9B0064CE8ADF6BF1747F4AD2306D93 \
FD3A5288F042B6850C66B31F09FE44734EB7990E \
71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 \
DD8F2338BAE7501E3DD5AC78C273792F7D83545D \
B9AE9905FFD7803F25714661B63B535A4C206CA9 \
C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 \
; do \
gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \
done
ENV NPM_CONFIG_LOGLEVEL info
ENV NODE_VERSION 5.12.0
RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
&& curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \
&& gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \
&& grep " node-v$NODE_VERSION-linux-x64.tar.xz\$" SHASUMS256.txt | sha256sum -c - \
&& tar -xJf "node-v$NODE_VERSION-linux-x64.tar.xz" -C /usr/local --strip-components=1 \
&& rm "node-v$NODE_VERSION-linux-x64.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt
CMD [ "node" ]
```
#### 6.x 版本
```
FROM buildpack-deps:jessie
# gpg keys listed at https://github.com/nodejs/node
RUN set -ex \
&& for key in \
9554F04D7259F04124DE6B476D5A82AC7E37093B \
94AE36675C464D64BAFA68DD7434390BDBE9B9C5 \
0034A06D9D9B0064CE8ADF6BF1747F4AD2306D93 \
FD3A5288F042B6850C66B31F09FE44734EB7990E \
71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 \
DD8F2338BAE7501E3DD5AC78C273792F7D83545D \
B9AE9905FFD7803F25714661B63B535A4C206CA9 \
C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 \
; do \
gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \
done
ENV NPM_CONFIG_LOGLEVEL info
ENV NODE_VERSION 6.3.1
RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
&& curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \
&& gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \
&& grep " node-v$NODE_VERSION-linux-x64.tar.xz\$" SHASUMS256.txt | sha256sum -c - \
&& tar -xJf "node-v$NODE_VERSION-linux-x64.tar.xz" -C /usr/local --strip-components=1 \
&& rm "node-v$NODE_VERSION-linux-x64.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt
CMD [ "node" ]
```

View File

@ -31,113 +31,5 @@ $ docker run -it --link some-redis:redis --rm redis sh -c 'exec redis-cli -h "$R
``` ```
### Dockerfile ### Dockerfile
#### 3.0 版本
```
FROM debian:jessie
# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
RUN groupadd -r redis && useradd -r -g redis redis
RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates \
wget \
&& rm -rf /var/lib/apt/lists/*
# grab gosu for easy step-down from root
ENV GOSU_VERSION 1.7
RUN set -x \
&& wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)" \
&& wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc" \
&& export GNUPGHOME="$(mktemp -d)" \
&& gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \
&& gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \
&& rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc \
&& chmod +x /usr/local/bin/gosu \
&& gosu nobody true
ENV REDIS_VERSION 3.0.7
ENV REDIS_DOWNLOAD_URL http://download.redis.io/releases/redis-3.0.7.tar.gz
ENV REDIS_DOWNLOAD_SHA1 e56b4b7e033ae8dbf311f9191cf6fdf3ae974d1c
# for redis-sentinel see: http://redis.io/topics/sentinel
RUN buildDeps='gcc libc6-dev make' \
&& set -x \
&& apt-get update && apt-get install -y $buildDeps --no-install-recommends \
&& rm -rf /var/lib/apt/lists/* \
&& wget -O redis.tar.gz "$REDIS_DOWNLOAD_URL" \
&& echo "$REDIS_DOWNLOAD_SHA1 *redis.tar.gz" | sha1sum -c - \
&& mkdir -p /usr/src/redis \
&& tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
&& rm redis.tar.gz \
&& make -C /usr/src/redis \
&& make -C /usr/src/redis install \
&& rm -r /usr/src/redis \
&& apt-get purge -y --auto-remove $buildDeps
RUN mkdir /data && chown redis:redis /data
VOLUME /data
WORKDIR /data
COPY docker-entrypoint.sh /usr/local/bin/
RUN ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh # backwards compat
ENTRYPOINT ["docker-entrypoint.sh"]
EXPOSE 6379
CMD [ "redis-server" ]
```
#### 3.2 版本
```
FROM debian:jessie
# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
RUN groupadd -r redis && useradd -r -g redis redis
RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates \
wget \
&& rm -rf /var/lib/apt/lists/*
# grab gosu for easy step-down from root
ENV GOSU_VERSION 1.7
RUN set -x \
&& wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)" \
&& wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc" \
&& export GNUPGHOME="$(mktemp -d)" \
&& gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \
&& gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \
&& rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc \
&& chmod +x /usr/local/bin/gosu \
&& gosu nobody true
ENV REDIS_VERSION 3.2.3
ENV REDIS_DOWNLOAD_URL http://download.redis.io/releases/redis-3.2.3.tar.gz
ENV REDIS_DOWNLOAD_SHA1 92d6d93ef2efc91e595c8bf578bf72baff397507
# for redis-sentinel see: http://redis.io/topics/sentinel
RUN buildDeps='gcc libc6-dev make' \
&& set -x \
&& apt-get update && apt-get install -y $buildDeps --no-install-recommends \
&& rm -rf /var/lib/apt/lists/* \
&& wget -O redis.tar.gz "$REDIS_DOWNLOAD_URL" \
&& echo "$REDIS_DOWNLOAD_SHA1 *redis.tar.gz" | sha1sum -c - \
&& mkdir -p /usr/src/redis \
&& tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
&& rm redis.tar.gz \
&& make -C /usr/src/redis \
&& make -C /usr/src/redis install \
&& rm -r /usr/src/redis \
&& apt-get purge -y --auto-remove $buildDeps
RUN mkdir /data && chown redis:redis /data
VOLUME /data
WORKDIR /data
COPY docker-entrypoint.sh /usr/local/bin/
ENTRYPOINT ["docker-entrypoint.sh"]
EXPOSE 6379
CMD [ "redis-server" ]
```
请到 https://github.com/docker-library/docs/tree/master/redis 查看。

View File

@ -15,130 +15,4 @@ root@523c70904d54:/#
### Dockerfile ### Dockerfile
#### 12.04 版本 请到 https://github.com/docker-library/docs/tree/master/ubuntu 查看。
```
FROM scratch
ADD precise-core-amd64.tar.gz /
# a few minor docker-specific tweaks
# see https://github.com/dotcloud/docker/blob/master/contrib/mkimage/debootstrap
RUN echo '#!/bin/sh' > /usr/sbin/policy-rc.d \
&& echo 'exit 101' >> /usr/sbin/policy-rc.d \
&& chmod +x /usr/sbin/policy-rc.d \
\
&& dpkg-divert --local --rename --add /sbin/initctl \
&& cp -a /usr/sbin/policy-rc.d /sbin/initctl \
&& sed -i 's/^exit.*/exit 0/' /sbin/initctl \
\
&& echo 'force-unsafe-io' > /etc/dpkg/dpkg.cfg.d/docker-apt-speedup \
\
&& echo 'DPkg::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' > /etc/apt/apt.conf.d/docker-clean \
&& echo 'APT::Update::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' >> /etc/apt/apt.conf.d/docker-clean \
&& echo 'Dir::Cache::pkgcache ""; Dir::Cache::srcpkgcache "";' >> /etc/apt/apt.conf.d/docker-clean \
\
&& echo 'Acquire::Languages "none";' > /etc/apt/apt.conf.d/docker-no-languages \
\
&& echo 'Acquire::GzipIndexes "true"; Acquire::CompressionTypes::Order:: "gz";' > /etc/apt/apt.conf.d/docker-gzip-indexes
# delete all the apt list files since they're big and get stale quickly
RUN rm -rf /var/lib/apt/lists/*
# this forces "apt-get update" in dependent images, which is also good
# enable the universe
RUN sed -i 's/^#\s*\(deb.*universe\)$/\1/g' /etc/apt/sources.list
# upgrade packages for now, since the tarballs aren't updated frequently enough
RUN apt-get update && apt-get dist-upgrade -y && rm -rf /var/lib/apt/lists/*
# overwrite this with 'CMD []' in a dependent Dockerfile
CMD ["/bin/bash"]
```
#### 14.04 版本
```
FROM scratch
ADD trusty-core-amd64.tar.gz /
# a few minor docker-specific tweaks
# see https://github.com/dotcloud/docker/blob/master/contrib/mkimage/debootstrap
RUN echo '#!/bin/sh' > /usr/sbin/policy-rc.d \
&& echo 'exit 101' >> /usr/sbin/policy-rc.d \
&& chmod +x /usr/sbin/policy-rc.d \
\
&& dpkg-divert --local --rename --add /sbin/initctl \
&& cp -a /usr/sbin/policy-rc.d /sbin/initctl \
&& sed -i 's/^exit.*/exit 0/' /sbin/initctl \
\
&& echo 'force-unsafe-io' > /etc/dpkg/dpkg.cfg.d/docker-apt-speedup \
\
&& echo 'DPkg::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' > /etc/apt/apt.conf.d/docker-clean \
&& echo 'APT::Update::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' >> /etc/apt/apt.conf.d/docker-clean \
&& echo 'Dir::Cache::pkgcache ""; Dir::Cache::srcpkgcache "";' >> /etc/apt/apt.conf.d/docker-clean \
\
&& echo 'Acquire::Languages "none";' > /etc/apt/apt.conf.d/docker-no-languages \
\
&& echo 'Acquire::GzipIndexes "true"; Acquire::CompressionTypes::Order:: "gz";' > /etc/apt/apt.conf.d/docker-gzip-indexes
# delete all the apt list files since they're big and get stale quickly
RUN rm -rf /var/lib/apt/lists/*
# this forces "apt-get update" in dependent images, which is also good
# enable the universe
RUN sed -i 's/^#\s*\(deb.*universe\)$/\1/g' /etc/apt/sources.list
# upgrade packages for now, since the tarballs aren't updated frequently enough
RUN apt-get update && apt-get dist-upgrade -y && rm -rf /var/lib/apt/lists/*
# overwrite this with 'CMD []' in a dependent Dockerfile
CMD ["/bin/bash"]
```
#### 16.04 版本
```
FROM scratch
ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /
# a few minor docker-specific tweaks
# see https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap
RUN set -xe \
\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L40-L48
&& echo '#!/bin/sh' > /usr/sbin/policy-rc.d \
&& echo 'exit 101' >> /usr/sbin/policy-rc.d \
&& chmod +x /usr/sbin/policy-rc.d \
\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L54-L56
&& dpkg-divert --local --rename --add /sbin/initctl \
&& cp -a /usr/sbin/policy-rc.d /sbin/initctl \
&& sed -i 's/^exit.*/exit 0/' /sbin/initctl \
\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L71-L78
&& echo 'force-unsafe-io' > /etc/dpkg/dpkg.cfg.d/docker-apt-speedup \
\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L85-L105
&& echo 'DPkg::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' > /etc/apt/apt.conf.d/docker-clean \
&& echo 'APT::Update::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' >> /etc/apt/apt.conf.d/docker-clean \
&& echo 'Dir::Cache::pkgcache ""; Dir::Cache::srcpkgcache "";' >> /etc/apt/apt.conf.d/docker-clean \
\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L109-L115
&& echo 'Acquire::Languages "none";' > /etc/apt/apt.conf.d/docker-no-languages \
\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L118-L130
&& echo 'Acquire::GzipIndexes "true"; Acquire::CompressionTypes::Order:: "gz";' > /etc/apt/apt.conf.d/docker-gzip-indexes \
\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L134-L151
&& echo 'Apt::AutoRemove::SuggestsImportant "false";' > /etc/apt/apt.conf.d/docker-autoremove-suggests
# delete all the apt list files since they're big and get stale quickly
RUN rm -rf /var/lib/apt/lists/*
# this forces "apt-get update" in dependent images, which is also good
# enable the universe
RUN sed -i 's/^#\s*\(deb.*universe\)$/\1/g' /etc/apt/sources.list
# overwrite this with 'CMD []' in a dependent Dockerfile
CMD ["/bin/bash"]
```

View File

@ -19,100 +19,5 @@ $ docker run --name some-wordpress --link some-mysql:mysql -d wordpress
* `-e WORDPRESS_AUTH_KEY=...`, `-e WORDPRESS_SECURE_AUTH_KEY=...`, `-e WORDPRESS_LOGGED_IN_KEY=...`, `-e WORDPRESS_NONCE_KEY=...`, `-e WORDPRESS_AUTH_SALT=...`, `-e WORDPRESS_SECURE_AUTH_SALT=...`, `-e WORDPRESS_LOGGED_IN_SALT=...`, `-e WORDPRESS_NONCE_SALT=...` 缺省为随机 sha1 串 * `-e WORDPRESS_AUTH_KEY=...`, `-e WORDPRESS_SECURE_AUTH_KEY=...`, `-e WORDPRESS_LOGGED_IN_KEY=...`, `-e WORDPRESS_NONCE_KEY=...`, `-e WORDPRESS_AUTH_SALT=...`, `-e WORDPRESS_SECURE_AUTH_SALT=...`, `-e WORDPRESS_LOGGED_IN_SALT=...`, `-e WORDPRESS_NONCE_SALT=...` 缺省为随机 sha1 串
### Dockerfile ### Dockerfile
#### 4.0 版本
```
FROM debian:wheezy
RUN apt-get update && apt-get install -y \
apache2 \
curl \
libapache2-mod-php5 \
php5-curl \
php5-gd \
php5-mysql \
rsync \
wget \
&& rm -rf /var/lib/apt/lists/*
RUN a2enmod rewrite
# copy a few things from apache's init script that it requires to be setup
ENV APACHE_CONFDIR /etc/apache2
ENV APACHE_ENVVARS $APACHE_CONFDIR/envvars
# and then a few more from $APACHE_CONFDIR/envvars itself
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_RUN_DIR /var/run/apache2
ENV APACHE_PID_FILE $APACHE_RUN_DIR/apache2.pid
ENV APACHE_LOCK_DIR /var/lock/apache2
ENV APACHE_LOG_DIR /var/log/apache2
ENV LANG C
RUN mkdir -p $APACHE_RUN_DIR $APACHE_LOCK_DIR $APACHE_LOG_DIR
# make CustomLog (access log) go to stdout instead of files
# and ErrorLog to stderr
RUN find "$APACHE_CONFDIR" -type f -exec sed -ri ' \
s!^(\s*CustomLog)\s+\S+!\1 /proc/self/fd/1!g; \
s!^(\s*ErrorLog)\s+\S+!\1 /proc/self/fd/2!g; \
' '{}' ';'
RUN rm -rf /var/www/html && mkdir /var/www/html
VOLUME /var/www/html
WORKDIR /var/www/html
ENV WORDPRESS_VERSION 4.0.0
ENV WORDPRESS_UPSTREAM_VERSION 4.0
# upstream tarballs include ./wordpress/ so this gives us /usr/src/wordpress
RUN curl -SL http://wordpress.org/wordpress-${WORDPRESS_UPSTREAM_VERSION}.tar.gz | tar -xzC /usr/src/
COPY docker-apache.conf /etc/apache2/sites-available/wordpress
RUN a2dissite 000-default && a2ensite wordpress
COPY docker-entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
EXPOSE 80
CMD ["apache2", "-DFOREGROUND"]
```
#### 4.5 版本
```
FROM php:5.6-apache
RUN a2enmod rewrite expires
# install the PHP extensions we need
RUN apt-get update && apt-get install -y libpng12-dev libjpeg-dev && rm -rf /var/lib/apt/lists/* \
&& docker-php-ext-configure gd --with-png-dir=/usr --with-jpeg-dir=/usr \
&& docker-php-ext-install gd mysqli opcache
# set recommended PHP.ini settings
# see https://secure.php.net/manual/en/opcache.installation.php
RUN { \
echo 'opcache.memory_consumption=128'; \
echo 'opcache.interned_strings_buffer=8'; \
echo 'opcache.max_accelerated_files=4000'; \
echo 'opcache.revalidate_freq=60'; \
echo 'opcache.fast_shutdown=1'; \
echo 'opcache.enable_cli=1'; \
} > /usr/local/etc/php/conf.d/opcache-recommended.ini
VOLUME /var/www/html
ENV WORDPRESS_VERSION 4.5.3
ENV WORDPRESS_SHA1 835b68748dae5a9d31c059313cd0150f03a49269
# upstream tarballs include ./wordpress/ so this gives us /usr/src/wordpress
RUN curl -o wordpress.tar.gz -SL https://wordpress.org/wordpress-${WORDPRESS_VERSION}.tar.gz \
&& echo "$WORDPRESS_SHA1 *wordpress.tar.gz" | sha1sum -c - \
&& tar -xzf wordpress.tar.gz -C /usr/src/ \
&& rm wordpress.tar.gz \
&& chown -R www-data:www-data /usr/src/wordpress
COPY docker-entrypoint.sh /entrypoint.sh
# grr, ENTRYPOINT resets CMD now
ENTRYPOINT ["/entrypoint.sh"]
CMD ["apache2-foreground"]
```
请到 https://github.com/docker-library/docs/tree/master/wordpress 查看。

View File

@ -16,7 +16,7 @@ Docker Registry 公开服务是开放给用户使用、允许用户管理镜像
最常使用的 Registry 公开服务是官方的 [Docker Hub](https://hub.docker.com/),这也是默认的 Registry并拥有大量的高质量的官方镜像。除此以外还有 [CoreOS](https://coreos.com/) 的 [Quay.io](https://quay.io/repository/)CoreOS 相关的镜像存储在这里Google 的 [Google Container Registry](https://cloud.google.com/container-registry/)[Kubernetes](http://kubernetes.io/) 的镜像使用的就是这个服务。 最常使用的 Registry 公开服务是官方的 [Docker Hub](https://hub.docker.com/),这也是默认的 Registry并拥有大量的高质量的官方镜像。除此以外还有 [CoreOS](https://coreos.com/) 的 [Quay.io](https://quay.io/repository/)CoreOS 相关的镜像存储在这里Google 的 [Google Container Registry](https://cloud.google.com/container-registry/)[Kubernetes](http://kubernetes.io/) 的镜像使用的就是这个服务。
由于某些原因,在国内访问这些服务可能会比较慢。国内的一些云服务商提供了针对 Docker Hub 的镜像服务Registry Mirror这些镜像服务被称为**加速器**。常见的有 [阿里云加速器](https://cr.console.aliyun.com/#/accelerator)、[DaoCloud 加速器](https://www.daocloud.io/mirror#accelerator-doc)、[灵雀云加速器](http://docs.alauda.cn/feature/accelerator.html)等。使用加速器会直接从国内的地址下载 Docker Hub 的镜像,比直接从官方网站下载速度会提高很多。在后面的章节中会有进一步如何配置加速器的讲解。 由于某些原因,在国内访问这些服务可能会比较慢。国内的一些云服务商提供了针对 Docker Hub 的镜像服务Registry Mirror这些镜像服务被称为**加速器**。常见的有 [阿里云加速器](https://cr.console.aliyun.com/#/accelerator)、[DaoCloud 加速器](https://www.daocloud.io/mirror#accelerator-doc) 等。使用加速器会直接从国内的地址下载 Docker Hub 的镜像,比直接从官方网站下载速度会提高很多。在后面的章节中会有进一步如何配置加速器的讲解。
国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 [时速云镜像仓库](https://hub.tenxcloud.com/)、[网易云镜像服务](https://c.163.com/hub#/m/library/)、[DaoCloud 镜像市场](https://hub.daocloud.io/)、[阿里云镜像库](https://cr.console.aliyun.com)等。 国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 [时速云镜像仓库](https://hub.tenxcloud.com/)、[网易云镜像服务](https://c.163.com/hub#/m/library/)、[DaoCloud 镜像市场](https://hub.daocloud.io/)、[阿里云镜像库](https://cr.console.aliyun.com)等。

View File

@ -7,6 +7,3 @@
具体包括云服务器、云存储、云数据库和弹性 web 引擎等基础云服务腾讯云分析MTA、腾讯云推送信鸽等腾讯整体大数据能力以及 QQ互联、QQ 空间、微云、微社区等云端链接社交体系。这些正是腾讯云可以提供给这个行业的差异化优势,造就了可支持各种互联网使用场景的高品质的腾讯云技术平台。 具体包括云服务器、云存储、云数据库和弹性 web 引擎等基础云服务腾讯云分析MTA、腾讯云推送信鸽等腾讯整体大数据能力以及 QQ互联、QQ 空间、微云、微社区等云端链接社交体系。这些正是腾讯云可以提供给这个行业的差异化优势,造就了可支持各种互联网使用场景的高品质的腾讯云技术平台。
腾讯云容器服务是高度可扩展的高性能容器管理服务用户可以在托管的云服务器实例集群上轻松运行应用程序。使用该服务将无需安装、运维、扩展用户的集群管理基础设施只需进行简单的API调用便可启动和停止Docker应用程序查询集群的完整状态以及使用各种云服务。用户可以根据用户的资源需求和可用性要求在用户的集群中安排容器的置放满足业务或应用程序的特定要求。 腾讯云容器服务是高度可扩展的高性能容器管理服务用户可以在托管的云服务器实例集群上轻松运行应用程序。使用该服务将无需安装、运维、扩展用户的集群管理基础设施只需进行简单的API调用便可启动和停止Docker应用程序查询集群的完整状态以及使用各种云服务。用户可以根据用户的资源需求和可用性要求在用户的集群中安排容器的置放满足业务或应用程序的特定要求。
*腾讯云已有用户或新用户都可以 [通过这里](http://partners.qcloud.com/invitation/25297829205816a19c316c6),在不做任何迁移的前提下,获得腾讯云服务的额外支持和大客户专享价格。*

View File

@ -1,9 +1,9 @@
## 使用 Django ## 使用 Django
我们现在将使用 Compose 配置并运行一个 Django/PostgreSQL 应用。在此之前,先确保 Compose 已经 [安装](install.md)。 我们现在将使用 Docker Compose 配置并运行一个 `Django/PostgreSQL` 应用。
在一切工作开始前,需要先设置好三个必要的文件。 在一切工作开始前,需要先设置好三个必要的文件。
第一步,因为应用将要运行在一个满足所有环境依赖的 Docker 容器里面,那么我们可以通过编辑 `Dockerfile` 文件来指定 Docker 容器要安装内容。内容如下: 第一步,因为应用将要运行在一个满足所有环境依赖的 Docker 容器里面,那么我们可以通过编辑 `Dockerfile` 文件来指定 Docker 容器要安装内容。内容如下:
``` ```
FROM python:2.7 FROM python:2.7
@ -24,20 +24,23 @@ psycopg2
``` ```
就是这么简单。 就是这么简单。
第三步,`docker-compose.yml` 文件将把所有的东西关联起来。它描述了应用的构成(一个 web 服务和一个数据库)、使用的 Docker 镜像、镜像之间的连接、挂载到容器的卷,以及服务开放的端口。 第三步,`docker-compose.yml` 文件将把所有的东西关联起来。它描述了应用的构成(一个 web 服务和一个数据库)、使用的 Docker 镜像、镜像之间的连接、挂载到容器的卷,以及服务开放的端口。
``` ```yaml
db: version: "3"
image: postgres services:
web:
build: . db:
command: python manage.py runserver 0.0.0.0:8000 image: postgres
volumes: web:
- .:/code build: .
ports: command: python manage.py runserver 0.0.0.0:8000
- "8000:8000" volumes:
links: - .:/code
- db ports:
- "8000:8000"
links:
- db
``` ```
查看 [`docker-compose.yml` 章节](yml_ref.md) 了解更多详细的工作机制。 查看 [`docker-compose.yml` 章节](yml_ref.md) 了解更多详细的工作机制。
@ -69,7 +72,7 @@ DATABASES = {
``` ```
这些信息是在 [postgres](https://registry.hub.docker.com/_/postgres/) Docker 镜像固定设置好的。 这些信息是在 [postgres](https://registry.hub.docker.com/_/postgres/) Docker 镜像固定设置好的。
然后,运行 `docker-compose up` 然后,运行 `docker-compose up`
``` ```
Recreating myapp_db_1... Recreating myapp_db_1...
Recreating myapp_web_1... Recreating myapp_web_1...
@ -86,7 +89,7 @@ myapp_web_1 | Django version 1.6.1, using settings 'django_example.settings'
myapp_web_1 | Starting development server at http://0.0.0.0:8000/ myapp_web_1 | Starting development server at http://0.0.0.0:8000/
myapp_web_1 | Quit the server with CONTROL-C. myapp_web_1 | Quit the server with CONTROL-C.
``` ```
这个 web 应用已经开始在你的 docker 守护进程里监听着 5000 端口了(如果你有使用 boot2docker ,执行 `boot2docker ip` ,就会看到它的地址) 这个 web 应用已经开始在你的 docker 守护进程里监听着 5000 端口了。
你还可以在 Docker 上运行其它的管理命令,例如对于同步数据库结构这种事,在运行完 `docker-compose up` 后,在另外一个终端运行以下命令即可: 你还可以在 Docker 上运行其它的管理命令,例如对于同步数据库结构这种事,在运行完 `docker-compose up` 后,在另外一个终端运行以下命令即可:

View File

@ -1,10 +1,8 @@
## 安装与卸载 ## 安装与卸载
Compose 目前支持 Linux 和 Mac OS 平台,两者的安装过程大同小异 Compose 目前支持 Linux、macOS、Windows 10 三大平台
安装 Compose 之前,要先安装 Docker需要 Docker Engine 1.7.1+),请参考第一部分中章节,在此不再赘述。 Compose 可以通过 Python 的包管理工具 pip 进行安装,也可以直接下载编译好的二进制文件使用,甚至直接运行在 Docker 容器中。
Compose 可以通过 Python 的 pip 工具进行安装,可以直接下载编译好的二进制文件使用,甚至直接运行在 Docker 容器中。
前两种方式是传统方式,适合本地环境下安装使用;最后一种方式则不破坏系统环境,更适合云计算场景。 前两种方式是传统方式,适合本地环境下安装使用;最后一种方式则不破坏系统环境,更适合云计算场景。
@ -76,7 +74,7 @@ $ curl -L https://raw.githubusercontent.com/docker/compose/1.8.0/contrib/complet
这些二进制文件,下载后直接放到执行路径下,并添加执行权限即可。 这些二进制文件,下载后直接放到执行路径下,并添加执行权限即可。
例如,在 Linux 平台上。 例如,在 Linux 和 macOS 平台上。
``` ```
$ sudo curl -L https://github.com/docker/compose/releases/download/1.8.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose $ sudo curl -L https://github.com/docker/compose/releases/download/1.8.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
@ -161,4 +159,4 @@ $ sudo rm /usr/local/bin/docker-compose
```sh ```sh
$ sudo pip uninstall docker-compose $ sudo pip uninstall docker-compose
``` ```

View File

@ -14,7 +14,7 @@ Compose 恰好满足了这样的需求。它允许用户通过一个单独的 `d
Compose 中有两个重要的概念: Compose 中有两个重要的概念:
* 服务service:一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。 * 服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
* 项目(project):由一组关联的应用容器组成的一个完整业务单元,在 `docker-compose.yml` 文件中定义。 * 项目(project):由一组关联的应用容器组成的一个完整业务单元,在 `docker-compose.yml` 文件中定义。
Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。 Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。

View File

@ -1,10 +1,10 @@
## 使用 Rail ## 使用 Rail
我们现在将使用 Compose 配置并运行一个 Rails/PostgreSQL 应用。在开始之前,先确保 Compose 已经 [安装](install.md)。 我们现在将使用 Compose 配置并运行一个 Rails/PostgreSQL 应用。
在一切工作开始前,需要先设置好三个必要的文件。 在一切工作开始前,需要先设置好三个必要的文件。
首先,因为应用将要运行在一个满足所有环境依赖的 Docker 容器里面,那么我们可以通过编辑 `Dockerfile` 文件来指定 Docker 容器要安装内容。内容如下: 首先,因为应用将要运行在一个满足所有环境依赖的 Docker 容器里面,那么我们可以通过编辑 `Dockerfile` 文件来指定 Docker 容器要安装内容。内容如下:
``` ```
FROM ruby FROM ruby
@ -24,23 +24,26 @@ gem 'rails', '4.0.2'
``` ```
最后,`docker-compose.yml` 文件才是最神奇的地方。 `docker-compose.yml` 文件将把所有的东西关联起来。它描述了应用的构成(一个 web 服务和一个数据库)、每个镜像的来源(数据库运行在使用预定义的 PostgreSQL 镜像web 应用侧将从本地目录创建)、镜像之间的连接,以及服务开放的端口。 最后,`docker-compose.yml` 文件才是最神奇的地方。 `docker-compose.yml` 文件将把所有的东西关联起来。它描述了应用的构成(一个 web 服务和一个数据库)、每个镜像的来源(数据库运行在使用预定义的 PostgreSQL 镜像web 应用侧将从本地目录创建)、镜像之间的连接,以及服务开放的端口。
```yaml
version: "3"
services:
db:
image: postgres
ports:
- "5432"
web:
build: .
command: bundle exec rackup -p 3000
volumes:
- .:/myapp
ports:
- "3000:3000"
links:
- db
``` ```
db: 所有文件就绪后,我们就可以通过使用 `docker-compose run` 命令生成应用的骨架了。
image: postgres
ports:
- "5432"
web:
build: .
command: bundle exec rackup -p 3000
volumes:
- .:/myapp
ports:
- "3000:3000"
links:
- db
```
所有文件就绪后,我们就可以通过使用 `docker-compose run` 命令生成应用的骨架了。
``` ```
$ docker-compose run web rails new . --force --database=postgresql --skip-bundle $ docker-compose run web rails new . --force --database=postgresql --skip-bundle
``` ```
@ -98,6 +101,6 @@ myapp_web_1 | [2014-01-17 17:16:29] INFO WEBrick::HTTPServer#start: pid=1 port=
``` ```
$ docker-compose run web rake db:create $ docker-compose run web rake db:create
``` ```
这个 web 应用已经开始在你的 docker 守护进程里面监听着 3000 端口了(如果你有使用 boot2docker ,执行 `boot2docker ip` ,就会看到它的地址) 这个 web 应用已经开始在你的 docker 守护进程里面监听着 3000 端口了。
![](../_images/docker-compose-rails-screenshot.png) ![](../_images/docker-compose-rails-screenshot.png)

View File

@ -3,8 +3,8 @@
### 术语 ### 术语
首先介绍几个术语。 首先介绍几个术语。
* 服务service:一个应用容器,实际上可以运行多个相同镜像的实例。 * 服务 (service):一个应用容器,实际上可以运行多个相同镜像的实例。
* 项目(project):由一组关联的应用容器组成的一个完整业务单元。 * 项目 (project):由一组关联的应用容器组成的一个完整业务单元。
可见一个项目可以由多个服务容器关联而成Compose 面向项目进行管理。 可见一个项目可以由多个服务容器关联而成Compose 面向项目进行管理。
@ -98,7 +98,7 @@ $ touch index.html
``` ```
#### Dockerfile #### Dockerfile
生成一个 Dockerfile,内容为 编写 `Dockerfile` 文件,内容为
```bash ```bash
FROM python:2.7 FROM python:2.7
WORKDIR /code WORKDIR /code
@ -108,7 +108,7 @@ CMD python index.py
``` ```
### haproxy 目录 ### haproxy 目录
在其中生成一个 `haproxy.cfg` 文件,内容为 编写 `haproxy.cfg` 文件,内容为
```bash ```bash
global global
log 127.0.0.1 local0 log 127.0.0.1 local0
@ -146,23 +146,25 @@ backend web_backends
### docker-compose.yml ### docker-compose.yml
编写 docker-compose.yml 文件,这个是 Compose 使用的主模板文件。内容十分简单,指定 3 个 web 容器,以及 1 个 haproxy 容器。 编写 docker-compose.yml 文件,这个是 Compose 使用的主模板文件。内容十分简单,指定 3 个 web 容器,以及 1 个 haproxy 容器。
```bash ```yaml
weba: version: "3"
services:
weba:
build: ./web build: ./web
expose: expose:
- 80 - 80
webb: webb:
build: ./web build: ./web
expose: expose:
- 80 - 80
webc: webc:
build: ./web build: ./web
expose: expose:
- 80 - 80
haproxy: haproxy:
image: haproxy:latest image: haproxy:latest
volumes: volumes:
- ./haproxy:/haproxy-override - ./haproxy:/haproxy-override
@ -180,7 +182,7 @@ haproxy:
``` ```
### 运行 compose 项目 ### 运行 compose 项目
现在 compose-haproxy-web 目录长成下面的样子。 现在 compose-haproxy-web 目录结构如下:
```bash ```bash
compose-haproxy-web compose-haproxy-web
├── docker-compose.yml ├── docker-compose.yml

View File

@ -1,14 +1,15 @@
## 使用 Wordpress ## 使用 Wordpress
Compose 让 Wordpress 运行在一个独立的环境中很简易。
[安装](install.md) Compose ,然后下载 Wordpress 到当前目录: Compose 可以很便捷的让 Wordpress 运行在一个独立的环境中。
``` 首先下载 Wordpress 到当前目录:
```bash
wordpress.org/latest.tar.gz | tar -xvzf - wordpress.org/latest.tar.gz | tar -xvzf -
``` ```
这将会创建一个叫 wordpress 目录,你也可以重命名成你想要的名字。在目录里面,创建一个 `Dockerfile` 文件,定义应用的运行环境: 这将会创建一个叫 wordpress 目录,你也可以重命名成你想要的名字。在目录里面,创建一个 `Dockerfile` 文件,定义应用的运行环境:
``` ```docker
FROM orchardup/php5 FROM orchardup/php5
ADD . /code ADD . /code
``` ```
@ -17,25 +18,28 @@ ADD . /code
下一步,`docker-compose.yml` 文件将开启一个 web 服务和一个独立的 MySQL 实例: 下一步,`docker-compose.yml` 文件将开启一个 web 服务和一个独立的 MySQL 实例:
``` ```yaml
web: version: "3"
build: . services:
command: php -S 0.0.0.0:8000 -t /code
ports: web:
- "8000:8000" build: .
links: command: php -S 0.0.0.0:8000 -t /code
- db ports:
volumes: - "8000:8000"
- .:/code links:
db: - db
image: orchardup/mysql volumes:
environment: - .:/code
MYSQL_DATABASE: wordpress db:
image: orchardup/mysql
environment:
MYSQL_DATABASE: wordpress
``` ```
要让这个应用跑起来还需要两个文件。 要让这个应用跑起来还需要两个文件。
第一个,`wp-condocker-compose.php` ,它是一个标准的 Wordpress 配置文件,有一点需要修改的是把数据库的配置指向 `db` 容器。 第一个,`wp-condocker-compose.php` ,它是一个标准的 Wordpress 配置文件,有一点需要修改的是把数据库的配置指向 `db` 容器。
``` ```php
<?php <?php
define('DB_NAME', 'wordpress'); define('DB_NAME', 'wordpress');
define('DB_USER', 'root'); define('DB_USER', 'root');
@ -64,7 +68,7 @@ require_once(ABSPATH . 'wp-settings.php');
``` ```
第二个,`router.php` ,它告诉 PHP 内置的服务器怎么运行 Wordpress: 第二个,`router.php` ,它告诉 PHP 内置的服务器怎么运行 Wordpress:
``` ```php
<?php <?php
$root = $_SERVER['DOCUMENT_ROOT']; $root = $_SERVER['DOCUMENT_ROOT'];
@ -83,5 +87,4 @@ if(file_exists($root.$path))
}else include_once 'index.php'; }else include_once 'index.php';
``` ```
这些配置文件就绪后,在你的 Wordpress 目录里面执行 `docker-compose up` 指令Compose 就会拉取镜像再创建我们所需要的镜像,然后启动 web 和数据库容器。 接着访问 docker 守护进程监听的 8000 端口就能看你的 Wordpress 网站了。(如果你有使用 boot2docker ,执行 `boot2docker ip` ,就会看到它的地址)。 这些配置文件就绪后,在你的 Wordpress 目录里面执行 `docker-compose up` 指令Compose 就会拉取镜像再创建我们所需要的镜像,然后启动 web 和数据库容器。 接着访问 docker 守护进程监听的 8000 端口就能看你的 Wordpress 网站了。

View File

@ -4,3 +4,5 @@
简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。 简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。
本章将具体介绍如何来管理一个容器,包括创建、启动和停止等。 本章将具体介绍如何来管理一个容器,包括创建、启动和停止等。
Docker 在 1.13 版本中引进了新的管理命令management commands在 Docker 1.13+ 推荐使用 `docker container` 子命令来管理 Docker 容器。

View File

@ -1,39 +1,56 @@
##后台(background)运行 ##后台(background)运行
更多的时候,需要让 Docker在后台运行而不是直接把执行命令的结果输出在当前宿主机下。此时可以通过添加 `-d` 参数来实现。 更多的时候,需要让 Docker 在后台运行而不是直接把执行命令的结果输出在当前宿主机下。此时,可以通过添加 `-d` 参数来实现。
下面举两个例子来说明一下。 下面举两个例子来说明一下。
如果不使用 `-d` 参数运行容器。 如果不使用 `-d` 参数运行容器。
```
$ sudo docker run ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done" ```bash
$ docker run ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
hello world hello world
hello world hello world
hello world hello world
hello world hello world
``` ```
容器会把输出的结果(STDOUT)打印到宿主机上面
容器会把输出的结果 (STDOUT) 打印到宿主机上面
如果使用了 `-d` 参数运行容器。 如果使用了 `-d` 参数运行容器。
```
$ sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done" ```bash
$ docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
77b2dc01fe0f3f1265df143181e7b9af5e05279a884f4776ee75350ea9d8017a 77b2dc01fe0f3f1265df143181e7b9af5e05279a884f4776ee75350ea9d8017a
``` ```
此时容器会在后台运行并不会把输出的结果(STDOUT)打印到宿主机上面(输出结果可以用docker logs 查看)。
**注:** 容器是否会长久运行是和docker run指定的命令有关`-d` 参数无关。 此时容器会在后台运行并不会把输出的结果 (STDOUT) 打印到宿主机上面(输出结果可以用 `docker logs` 查看)。
**注:** 容器是否会长久运行,是和 `docker run` 指定的命令有关,和 `-d` 参数无关。
使用 `-d` 参数启动后会返回一个唯一的 id也可以通过 `docker ps` 命令来查看容器信息。 使用 `-d` 参数启动后会返回一个唯一的 id也可以通过 `docker ps` 命令来查看容器信息。
```
$ sudo docker ps ```bash
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
77b2dc01fe0f ubuntu:14.04 /bin/sh -c 'while tr 2 minutes ago Up 1 minute agitated_wright 77b2dc01fe0f ubuntu:14.04 /bin/sh -c 'while tr 2 minutes ago Up 1 minute agitated_wright
``` ```
要获取容器的输出信息,可以通过 `docker logs` 命令。 要获取容器的输出信息,可以通过 `docker logs` 命令。
```
$ sudo docker logs [container ID or NAMES] ```bash
$ docker logs [container ID or NAMES]
hello world hello world
hello world hello world
hello world hello world
. . . . . .
``` ```
# Docker 1.13+
在 Docker 1.13+ 版本中推荐使用 docker container 来管理镜像。
```bash
$ docker container run -d
$ docker container ls
$ docker container logs
```

View File

@ -2,8 +2,9 @@
在使用 `-d` 参数时,容器启动后会进入后台。 在使用 `-d` 参数时,容器启动后会进入后台。
某些时候需要进入容器进行操作,有很多种方法,包括使用 `docker attach` 命令或 `nsenter` 工具等。 某些时候需要进入容器进行操作,有很多种方法,包括使用 `docker attach` 命令或 `nsenter` 工具等。
### attach 命令 ### attach 命令
`docker attach` 是Docker自带的命令。下面示例如何使用该命令。 `docker attach` 是 Docker 自带的命令。下面示例如何使用该命令。
```
```bash
$ sudo docker run -idt ubuntu $ sudo docker run -idt ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550 243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
$ sudo docker ps $ sudo docker ps
@ -12,6 +13,7 @@ CONTAINER ID IMAGE COMMAND CREATED
$sudo docker attach nostalgic_hypatia $sudo docker attach nostalgic_hypatia
root@243c32535da7:/# root@243c32535da7:/#
``` ```
但是使用 `attach` 命令有时候并不方便。当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。 但是使用 `attach` 命令有时候并不方便。当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。
### nsenter 命令 ### nsenter 命令
@ -27,27 +29,36 @@ $ make nsenter && sudo cp nsenter /usr/local/bin
#### 使用 #### 使用
`nsenter` 启动一个新的shell进程(默认是/bin/bash), 同时会把这个新进程切换到和目标(target)进程相同的命名空间这样就相当于进入了容器内部。nsenter 要正常工作需要有 root 权限。 `nsenter` 启动一个新的shell进程(默认是/bin/bash), 同时会把这个新进程切换到和目标(target)进程相同的命名空间这样就相当于进入了容器内部。nsenter 要正常工作需要有 root 权限。
很不幸Ubuntu 14.04 仍然使用的是 util-linux 2.20。安装最新版本的 util-linux2.29)版,请按照以下步骤: 很不幸Ubuntu 14.04 仍然使用的是 util-linux 2.20。安装最新版本的 util-linux2.29)版,请按照以下步骤:
```
```bash
$ wget https://www.kernel.org/pub/linux/utils/util-linux/v2.29/util-linux-2.29.tar.xz; tar xJvf util-linux-2.29.tar.xz $ wget https://www.kernel.org/pub/linux/utils/util-linux/v2.29/util-linux-2.29.tar.xz; tar xJvf util-linux-2.29.tar.xz
$ cd util-linux-2.29 $ cd util-linux-2.29
$ ./configure --without-ncurses && make nsenter $ ./configure --without-ncurses && make nsenter
$ sudo cp nsenter /usr/local/bin $ sudo cp nsenter /usr/local/bin
``` ```
为了连接到容器,你还需要找到容器的第一个进程的 PID可以通过下面的命令获取。 为了连接到容器,你还需要找到容器的第一个进程的 PID可以通过下面的命令获取。
```
```bash
PID=$(docker inspect --format "{{ .State.Pid }}" <container>) PID=$(docker inspect --format "{{ .State.Pid }}" <container>)
``` ```
通过这个 PID就可以连接到这个容器 通过这个 PID就可以连接到这个容器
```
```bash
$ nsenter --target $PID --mount --uts --ipc --net --pid $ nsenter --target $PID --mount --uts --ipc --net --pid
``` ```
如果无法通过以上命令连接到这个容器有可能是因为宿主的默认shell在容器中并不存在比如zsh可以使用如下命令显式地使用bash。 如果无法通过以上命令连接到这个容器有可能是因为宿主的默认shell在容器中并不存在比如zsh可以使用如下命令显式地使用bash。
```
$ nsenter --target $pid --mount --uts --ipc --net --pid -- /usr/bin/env \ ```bash
$ nsenter --target $pid --mount --uts --ipc --net --pid -- /usr/bin/env \
--ignore-environment HOME=/root /bin/bash --login --ignore-environment HOME=/root /bin/bash --login
``` ```
下面给出一个完整的例子。 下面给出一个完整的例子。
```
```bash
$ sudo docker run -idt ubuntu $ sudo docker run -idt ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550 243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
$ sudo docker ps $ sudo docker ps
@ -58,14 +69,18 @@ $ PID=$(docker-pid 243c32535da7)
$ sudo nsenter --target 10981 --mount --uts --ipc --net --pid $ sudo nsenter --target 10981 --mount --uts --ipc --net --pid
root@243c32535da7:/# root@243c32535da7:/#
``` ```
更简单的,建议大家下载 更简单的,建议大家下载
[.bashrc_docker](https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker),并将内容放到 .bashrc 中。 [.bashrc_docker](https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker),并将内容放到 .bashrc 中。
```
```bash
$ wget -P ~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker; $ wget -P ~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker;
$ echo "[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker" >> ~/.bashrc; source ~/.bashrc $ echo "[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker" >> ~/.bashrc; source ~/.bashrc
``` ```
这个文件中定义了很多方便使用 Docker 的命令,例如 `docker-pid` 可以获取某个容器的 PID`docker-enter` 可以进入容器或直接在容器内执行命令。 这个文件中定义了很多方便使用 Docker 的命令,例如 `docker-pid` 可以获取某个容器的 PID`docker-enter` 可以进入容器或直接在容器内执行命令。
```
```bash
$ echo $(docker-pid <container>) $ echo $(docker-pid <container>)
$ docker-enter <container> ls $ docker-enter <container> ls
``` ```

View File

@ -3,7 +3,7 @@
###导出容器 ###导出容器
如果要导出本地某个容器,可以使用 `docker export` 命令。 如果要导出本地某个容器,可以使用 `docker export` 命令。
``` ```
$ sudo docker ps -a $ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7691a814370e ubuntu:14.04 "/bin/bash" 36 hours ago Exited (0) 21 hours ago test 7691a814370e ubuntu:14.04 "/bin/bash" 36 hours ago Exited (0) 21 hours ago test
$ sudo docker export 7691a814370e > ubuntu.tar $ sudo docker export 7691a814370e > ubuntu.tar
@ -14,15 +14,23 @@ $ sudo docker export 7691a814370e > ubuntu.tar
可以使用 `docker import` 从容器快照文件中再导入为镜像,例如 可以使用 `docker import` 从容器快照文件中再导入为镜像,例如
``` ```
$ cat ubuntu.tar | sudo docker import - test/ubuntu:v1.0 $ cat ubuntu.tar | sudo docker import - test/ubuntu:v1.0
$ sudo docker images $ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
test/ubuntu v1.0 9d37a6082e97 About a minute ago 171.3 MB test/ubuntu v1.0 9d37a6082e97 About a minute ago 171.3 MB
``` ```
此外,也可以通过指定 URL 或者某个目录来导入,例如 此外,也可以通过指定 URL 或者某个目录来导入,例如
``` ```
$sudo docker import http://example.com/exampleimage.tgz example/imagerepo $ docker import http://example.com/exampleimage.tgz example/imagerepo
``` ```
*注:用户既可以使用 `docker load` 来导入镜像存储文件到本地镜像库,也可以使用 `docker import` 来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。 *注:用户既可以使用 `docker load` 来导入镜像存储文件到本地镜像库,也可以使用 `docker import` 来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。*
## Docker 1.13+
在 Docker 1.13+ 版本中推荐使用 docker container 来管理容器。
```bash
$ docker container export
$ docker image import
```

View File

@ -1,14 +1,24 @@
##删除容器 ## 删除容器
可以使用 `docker rm` 来删除一个处于终止状态的容器。 可以使用 `docker rm` 来删除一个处于终止状态的容器。
例如 例如
``` ```
$sudo docker rm trusting_newton $ docker rm trusting_newton
trusting_newton trusting_newton
``` ```
如果要删除一个运行中的容器,可以添加 `-f` 参数。Docker 会发送 `SIGKILL` 信号给容器。 如果要删除一个运行中的容器,可以添加 `-f` 参数。Docker 会发送 `SIGKILL` 信号给容器。
##清理所有处于终止状态的容器 ## 清理所有处于终止状态的容器
`docker ps -a` 命令可以查看所有已经创建的包括终止状态的容器,如果数量太多要一个个删除可能会很麻烦,用 `docker rm $(docker ps -a -q)` 可以全部清理掉。 `docker ps -a` 命令可以查看所有已经创建的包括终止状态的容器,如果数量太多要一个个删除可能会很麻烦,用 `docker rm $(docker ps -a -q)` 可以全部清理掉。
*注意:这个命令其实会试图删除所有的包括还在运行中的容器,不过就像上面提过的 `docker rm` 默认并不会删除运行中的容器。 *注意:这个命令其实会试图删除所有的包括还在运行中的容器,不过就像上面提过的 `docker rm` 默认并不会删除运行中的容器。*
## Docker 1.13+
在 Docker 1.13+ 版本中推荐使用 docker container 来管理容器。
```bash
$ docker container rm trusting_newton
$ docker container prune
```

View File

@ -8,14 +8,14 @@
例如,下面的命令输出一个 “Hello World”之后终止容器。 例如,下面的命令输出一个 “Hello World”之后终止容器。
``` ```
$ sudo docker run ubuntu:14.04 /bin/echo 'Hello world' $ docker run ubuntu:14.04 /bin/echo 'Hello world'
Hello world Hello world
``` ```
这跟在本地直接执行 `/bin/echo 'hello world'` 几乎感觉不出任何区别。 这跟在本地直接执行 `/bin/echo 'hello world'` 几乎感觉不出任何区别。
下面的命令则启动一个 bash 终端,允许用户进行交互。 下面的命令则启动一个 bash 终端,允许用户进行交互。
``` ```
$ sudo docker run -t -i ubuntu:14.04 /bin/bash $ docker run -t -i ubuntu:14.04 /bin/bash
root@af8bae53bdd3:/# root@af8bae53bdd3:/#
``` ```
其中,`-t` 选项让Docker分配一个伪终端pseudo-tty并绑定到容器的标准输入上 `-i` 则让容器的标准输入保持打开。 其中,`-t` 选项让Docker分配一个伪终端pseudo-tty并绑定到容器的标准输入上 `-i` 则让容器的标准输入保持打开。
@ -49,3 +49,13 @@ root@ba267838cc1b:/# ps
11 ? 00:00:00 ps 11 ? 00:00:00 ps
``` ```
可见,容器中仅运行了指定的 bash 应用。这种特点使得 Docker 对资源的利用率极高,是货真价实的轻量级虚拟化。 可见,容器中仅运行了指定的 bash 应用。这种特点使得 Docker 对资源的利用率极高,是货真价实的轻量级虚拟化。
## Docker 1.13+
在 Docker 1.13+ 版本中推荐使用 docker container 来管理容器。
```bash
$ docker container run ubuntu:17.10 /bin/echo 'Hello world'
$ docker container start
```

View File

@ -1,4 +1,4 @@
##终止容器 ## 终止容器
可以使用 `docker stop` 来终止一个运行中的容器。 可以使用 `docker stop` 来终止一个运行中的容器。
此外当Docker容器中指定的应用终结时容器也自动终止。 此外当Docker容器中指定的应用终结时容器也自动终止。
@ -15,3 +15,15 @@ ba267838cc1b ubuntu:14.04 "/bin/bash" 30 minutes a
处于终止状态的容器,可以通过 `docker start` 命令来重新启动。 处于终止状态的容器,可以通过 `docker start` 命令来重新启动。
此外,`docker restart` 命令会将一个运行态的容器终止,然后再重新启动它。 此外,`docker restart` 命令会将一个运行态的容器终止,然后再重新启动它。
## Docker 1.13+
在 Docker 1.13+ 版本中推荐使用 docker container 来管理容器。
```bash
$ docker container ls
$ docker container start
$ docker container restart
```

View File

@ -2,3 +2,5 @@
这一章介绍如何在 Docker 内部以及容器之间管理数据,在容器中管理数据主要有两种方式: 这一章介绍如何在 Docker 内部以及容器之间管理数据,在容器中管理数据主要有两种方式:
* 数据卷Data volumes * 数据卷Data volumes
* 数据卷容器Data volume containers * 数据卷容器Data volume containers
Docker 在 1.13 版本引进了新的管理命令management commands在 Docker 1.13+ 推荐使用 `docker volume` 子命令来管理 Docker 数据卷。

View File

@ -8,3 +8,5 @@ Docker 运行容器前需要本地存在对应的镜像,如果镜像不存在
* 从仓库获取镜像; * 从仓库获取镜像;
* 管理本地主机上的镜像; * 管理本地主机上的镜像;
* 介绍镜像实现的基本原理。 * 介绍镜像实现的基本原理。
Docker 在 1.13 版本引进了新的管理命令management commands在 Docker 1.13+ 推荐使用 `docker image` 子命令来管理 Docker 镜像。

View File

@ -222,3 +222,11 @@ $ docker build - < context.tar.gz
如果发现标准输入的文件格式是 `gzip`、`bzip2` 以及 `xz` 的话,将会使其为上下文压缩包,直接将其展开,将里面视为上下文,并开始构建。 如果发现标准输入的文件格式是 `gzip`、`bzip2` 以及 `xz` 的话,将会使其为上下文压缩包,直接将其展开,将里面视为上下文,并开始构建。
[^1]: [Docker Store](https://store.docker.com/)是发现公共Docker内容镜像发布和发行软件的新地方 [^1]: [Docker Store](https://store.docker.com/)是发现公共Docker内容镜像发布和发行软件的新地方
# Docker 1.13+
在 Docker 1.13+ 版本中推荐使用 docker image 来管理镜像。
```bash
$ docker image build
```

View File

@ -1,5 +1,7 @@
## 利用 commit 理解镜像构成 ## 利用 commit 理解镜像构成
注意: `docker commit` 命令除了学习之外,还有一些特殊的应用场合,比如被入侵后保存现场等。但是,不要使用 `docker commit` 定制镜像,定制镜像应该使用 `Dockerfile` 来完成。如果你想要定制镜像请查看下一章节。
镜像是容器的基础,每次执行 `docker run` 的时候都会指定哪个镜像作为容器运行的基础。在之前的例子中,我们所使用的都是来自于 Docker Hub 的镜像。直接使用这些镜像是可以满足一定的需求,而当这些镜像无法直接满足需求时,我们就需要定制这些镜像。接下来的几节就将讲解如何定制镜像。 镜像是容器的基础,每次执行 `docker run` 的时候都会指定哪个镜像作为容器运行的基础。在之前的例子中,我们所使用的都是来自于 Docker Hub 的镜像。直接使用这些镜像是可以满足一定的需求,而当这些镜像无法直接满足需求时,我们就需要定制这些镜像。接下来的几节就将讲解如何定制镜像。
回顾一下之前我们学到的知识,镜像是多层存储,每一层是在前一层的基础上进行的修改;而容器同样也是多层存储,是在以镜像为基础层,在其基础上加一层作为容器运行时的存储层。 回顾一下之前我们学到的知识,镜像是多层存储,每一层是在前一层的基础上进行的修改;而容器同样也是多层存储,是在以镜像为基础层,在其基础上加一层作为容器运行时的存储层。
@ -124,5 +126,3 @@ docker run --name web2 -d -p 81:80 nginx:v2
此外,使用 `docker commit` 意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为**黑箱镜像**,换句话说,就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人根本无从得知。而且,即使是这个制作镜像的人,过一段时间后也无法记清具体在操作的。虽然 `docker diff` 或许可以告诉得到一些线索,但是远远不到可以确保生成一致镜像的地步。这种黑箱镜像的维护工作是非常痛苦的。 此外,使用 `docker commit` 意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为**黑箱镜像**,换句话说,就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人根本无从得知。而且,即使是这个制作镜像的人,过一段时间后也无法记清具体在操作的。虽然 `docker diff` 或许可以告诉得到一些线索,但是远远不到可以确保生成一致镜像的地步。这种黑箱镜像的维护工作是非常痛苦的。
而且,回顾之前提及的镜像所使用的分层存储的概念,除当前层外,之前的每一层都是不会发生改变的,换句话说,任何修改的结果仅仅是在当前层进行标记、添加、修改,而不会改动上一层。如果使用 `docker commit` 制作镜像,以及后期修改的话,每一次修改都会让镜像更加臃肿一次,所删除的上一层的东西并不会丢失,会一直如影随形的跟着这个镜像,即使根本无法访问到™。这会让镜像更加臃肿。 而且,回顾之前提及的镜像所使用的分层存储的概念,除当前层外,之前的每一层都是不会发生改变的,换句话说,任何修改的结果仅仅是在当前层进行标记、添加、修改,而不会改动上一层。如果使用 `docker commit` 制作镜像,以及后期修改的话,每一次修改都会让镜像更加臃肿一次,所删除的上一层的东西并不会丢失,会一直如影随形的跟着这个镜像,即使根本无法访问到™。这会让镜像更加臃肿。
`docker commit` 命令除了学习之外,还有一些特殊的应用场合,比如被入侵后保存现场等。但是,不要使用 `docker commit` 定制镜像,定制行为应该使用 `Dockerfile` 来完成。下面的章节我们就来讲述一下如何使用 `Dockerfile` 定制镜像。

View File

@ -46,6 +46,12 @@ REPOSITORY TAG IMAGE ID CREATED
$ docker rmi $(docker images -q -f dangling=true) $ docker rmi $(docker images -q -f dangling=true)
``` ```
注意:如果你使用的是 Docker 1.13+ 版本,你可以便捷的使用以下命令来删除虚悬镜像。
```bash
$ docker image prune
```
### 中间层镜像 ### 中间层镜像
为了加速镜像构建、重复利用资源Docker 会利用 **中间层镜像**。所以在使用一段时间后,可能会看到一些依赖的中间层镜像。默认的 `docker images` 列表中只会显示顶层镜像,如果希望显示包括中间层镜像在内的所有镜像的话,需要加 `-a` 参数。 为了加速镜像构建、重复利用资源Docker 会利用 **中间层镜像**。所以在使用一段时间后,可能会看到一些依赖的中间层镜像。默认的 `docker images` 列表中只会显示顶层镜像,如果希望显示包括中间层镜像在内的所有镜像的话,需要加 `-a` 参数。
@ -141,3 +147,11 @@ f753707788c5 ubuntu 16.04
f753707788c5 ubuntu latest f753707788c5 ubuntu latest
1e0c3dd64ccd ubuntu 14.04 1e0c3dd64ccd ubuntu 14.04
``` ```
## Docker 1.13+
在 Docker 1.13+ 版本中推荐使用 docker image 来管理镜像。
```bash
$ docker image ls
```

View File

@ -70,3 +70,13 @@ Loaded image: alpine:latest
```bash ```bash
docker save <镜像名> | bzip2 | pv | ssh <用户名>@<主机名> 'cat | docker load' docker save <镜像名> | bzip2 | pv | ssh <用户名>@<主机名> 'cat | docker load'
``` ```
## Docker 1.13+
在 Docker 1.13+ 版本中推荐使用 docker image 来管理镜像。
```bash
$ docker image import
$ docker image load
$ docker image save
```

View File

@ -31,7 +31,7 @@ Status: Downloaded newer image for ubuntu:14.04
从下载过程中可以看到我们之前提及的分层存储的概念,镜像是由多层存储所构成。下载也是一层层的去下载,并非单一文件。下载过程中给出了每一层的 ID 的前 12 位。并且下载结束后,给出该镜像完整的 `sha256` 的摘要,以确保下载一致性。 从下载过程中可以看到我们之前提及的分层存储的概念,镜像是由多层存储所构成。下载也是一层层的去下载,并非单一文件。下载过程中给出了每一层的 ID 的前 12 位。并且下载结束后,给出该镜像完整的 `sha256` 的摘要,以确保下载一致性。
实验上面命令的时候,你可能会发现,你所看到的层 ID 以及 `sha256` 的摘要和这里的不一样。这是因为官方镜像是一直在维护的,有任何新的 bug或者版本更新都会进行修复再以原来的标签发布这样可以确保任何使用这个标签的用户可以获得更安全、更稳定的镜像。 使用上面命令的时候,你可能会发现,你所看到的层 ID 以及 `sha256` 的摘要和这里的不一样。这是因为官方镜像是一直在维护的,有任何新的 bug或者版本更新都会进行修复再以原来的标签发布这样可以确保任何使用这个标签的用户可以获得更安全、更稳定的镜像。
*如果从 Docker Hub 下载镜像非常缓慢,可以参照 [镜像加速器](/install/mirror.md) 一节配置加速器。* *如果从 Docker Hub 下载镜像非常缓慢,可以参照 [镜像加速器](/install/mirror.md) 一节配置加速器。*
@ -40,7 +40,10 @@ Status: Downloaded newer image for ubuntu:14.04
有了镜像后,我们就可以以这个镜像为基础启动一个容器来运行。以上面的 `ubuntu:14.04` 为例,如果我们打算启动里面的 `bash` 并且进行交互式操作的话,可以执行下面的命令。 有了镜像后,我们就可以以这个镜像为基础启动一个容器来运行。以上面的 `ubuntu:14.04` 为例,如果我们打算启动里面的 `bash` 并且进行交互式操作的话,可以执行下面的命令。
```bash ```bash
$ docker run -it --rm ubuntu:14.04 bash $ docker run -it --rm \
ubuntu:14.04 \
bash
root@e7009c6ce357:/# cat /etc/os-release root@e7009c6ce357:/# cat /etc/os-release
NAME="Ubuntu" NAME="Ubuntu"
VERSION="14.04.5 LTS, Trusty Tahr" VERSION="14.04.5 LTS, Trusty Tahr"
@ -66,3 +69,15 @@ $
进入容器后,我们可以在 Shell 下操作,执行任何所需的命令。这里,我们执行了 `cat /etc/os-release`,这是 Linux 常用的查看当前系统版本的命令,从返回的结果可以看到容器内是 `Ubuntu 14.04.5 LTS` 系统。 进入容器后,我们可以在 Shell 下操作,执行任何所需的命令。这里,我们执行了 `cat /etc/os-release`,这是 Linux 常用的查看当前系统版本的命令,从返回的结果可以看到容器内是 `Ubuntu 14.04.5 LTS` 系统。
最后我们通过 `exit` 退出了这个容器。 最后我们通过 `exit` 退出了这个容器。
## Docker 1.13+
在 Docker 1.13+ 版本中推荐使用 docker image 来管理镜像。
```bash
$ docker image pull ubunut:17.10
$ docker container run -it --rm \
ubuntu:17.10 \
bash
```

View File

@ -103,3 +103,11 @@ $ docker rmi $(docker images -q -f before=mongo:3.2)
所以对于 CentOS/RHEL 的用户来说,在没有办法使用 `UnionFS` 的情况下,一定要配置 `direct-lvm``devicemapper`,无论是为了性能、稳定性还是空间利用率。 所以对于 CentOS/RHEL 的用户来说,在没有办法使用 `UnionFS` 的情况下,一定要配置 `direct-lvm``devicemapper`,无论是为了性能、稳定性还是空间利用率。
*或许有人注意到了 CentOS 7 中存在被 backports 回来的 `overlay` 驱动,不过 CentOS 里的这个驱动达不到生产环境使用的稳定程度,所以不推荐使用。* *或许有人注意到了 CentOS 7 中存在被 backports 回来的 `overlay` 驱动,不过 CentOS 里的这个驱动达不到生产环境使用的稳定程度,所以不推荐使用。*
## Docker 1.13+
在 Docker 1.13+ 版本中推荐使用 docker image 来管理镜像。
```bash
$ docker image rm
```

View File

@ -2,12 +2,12 @@
Docker 在 1.13 版本之后,从 2017 年的 3 月 1 日开始,版本命名规则变为如下: Docker 在 1.13 版本之后,从 2017 年的 3 月 1 日开始,版本命名规则变为如下:
| 项目 | 说明 | 项目 | 说明
| -- | -- | --------------- | -------
| 版本格式 | YY.MM | 版本格式 | YY.MM
| stable 版本 | 每个季度发行 | stable 版本 | 每个季度发行
| edge 版本 | 每个月发行 | edge 版本 | 每个月发行
| 当前 Docker CE 版本 | 17.07.0 | 当前 Docker CE 版本 | 17.10.0
同时 Docker 划分为 CE 和 EE。CE 版本即社区版免费支持周期三个月EE 即企业版,强调安全,付费使用。 同时 Docker 划分为 CE 和 EE。CE 版本即社区版免费支持周期三个月EE 即企业版,强调安全,付费使用。

View File

@ -12,9 +12,9 @@ Docker CE 支持 64 位版本 CentOS 7并且要求内核版本不低于 3.10
```bash ```bash
$ sudo yum remove docker \ $ sudo yum remove docker \
docker-common \ docker-common \
docker-selinux \ docker-selinux \
docker-engine docker-engine
``` ```
### 使用 yum 源 安装 ### 使用 yum 源 安装
@ -22,7 +22,9 @@ $ sudo yum remove docker \
执行以下命令安装依赖包: 执行以下命令安装依赖包:
```bash ```bash
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2 $ sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
``` ```
鉴于国内网络问题,强烈建议使用国内源,下面先介绍国内源的使用。 鉴于国内网络问题,强烈建议使用国内源,下面先介绍国内源的使用。
@ -34,7 +36,7 @@ $ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
```bash ```bash
$ sudo yum-config-manager \ $ sudo yum-config-manager \
--add-repo \ --add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
``` ```
>以上命令会添加稳定版本的 Docker CE yum 源。从 Docker 17.06 开始edge test 版本的 yum 源也会包含稳定版本的 Docker CE。 >以上命令会添加稳定版本的 Docker CE yum 源。从 Docker 17.06 开始edge test 版本的 yum 源也会包含稳定版本的 Docker CE。

View File

@ -18,7 +18,9 @@ Docker CE 可以安装在 64 位的 x86 平台或 ARM 平台上(如[树莓派]
旧版本的 Docker 称为 `docker` 或者 `docker-engine`,使用以下命令卸载旧版本: 旧版本的 Docker 称为 `docker` 或者 `docker-engine`,使用以下命令卸载旧版本:
```bash ```bash
$ sudo apt-get remove docker docker-engine docker.io $ sudo apt-get remove docker \
docker-engine \
docker.io
``` ```
#### Debian 7 Wheezy #### Debian 7 Wheezy
@ -64,14 +66,14 @@ $ sudo apt-get install \
为了确认所下载软件包的合法性,需要添加软件源的 GPG 密钥。 为了确认所下载软件包的合法性,需要添加软件源的 GPG 密钥。
```bash ```bash
$ curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/debian/gpg | sudo apt-key add - $ curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/debian/gpg | sudo apt-key add -
``` ```
然后,我们需要向 `source.list` 中添加 Docker CE 软件源: 然后,我们需要向 `source.list` 中添加 Docker CE 软件源:
```bash ```bash
$ sudo add-apt-repository \ $ sudo add-apt-repository \
"deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/debian \ "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/$(. /etc/os-release; echo "$ID") \
$(lsb_release -cs) \ $(lsb_release -cs) \
stable" stable"
``` ```
@ -124,7 +126,7 @@ $ sudo sh get-docker.sh --mirror Aliyun
```bash ```bash
$ sudo add-apt-repository \ $ sudo add-apt-repository \
"deb [arch=armhf] https://mirrors.aliyun.com/docker-ce/linux/debian \ "deb [arch=armhf] https://mirrors.ustc.edu.cn/docker-ce/linux/debian \
$(lsb_release -cs) \ $(lsb_release -cs) \
stable" stable"
``` ```
@ -137,6 +139,7 @@ ARM 平台不能使用 x86 镜像,查看树莓派可使用镜像请访问 [arm
$ sudo systemctl enable docker $ sudo systemctl enable docker
$ sudo systemctl start docker $ sudo systemctl start docker
``` ```
Debian 7 Wheezy 请使用以下命令启动 Debian 7 Wheezy 请使用以下命令启动
```bash ```bash

View File

@ -22,53 +22,50 @@ DOCKER_OPTS="--registry-mirror=https://jxus37ad.mirror.aliyuncs.com"
$ sudo service docker restart $ sudo service docker restart
``` ```
### Ubuntu 16.04、Debian 8 Jessie、CentOS 7 ### Ubuntu 16.04+、Debian 8+、CentOS 7
对于使用 [systemd](https://www.freedesktop.org/wiki/Software/systemd/) 的系统,`systemctl enable docker` 启用服务后,编辑 `/etc/systemd/system/multi-user.target.wants/docker.service` 文件,找到 `ExecStart=` 这一行,在这行最后添加加速器地址 `--registry-mirror=<加速器地址>`,如: 对于使用 [systemd](https://www.freedesktop.org/wiki/Software/systemd/) 的系统,请在 `/etc/docker/daemon.json` 中写入如下内容(如果文件不存在请新建该文件)
```bash ```json
ExecStart=/usr/bin/dockerd --registry-mirror=https://jxus37ad.mirror.aliyuncs.com {
"registry-mirrors": [
"https://sr5arhkn.mirror.aliyuncs.com",
]
}
``` ```
*注:对于 1.12 以前的版本,`dockerd` 换成 `docker daemon`。* 之后重新启动服务。
重新加载配置并且重新启动。
```bash ```bash
$ sudo systemctl daemon-reload $ sudo systemctl daemon-reload
$ sudo systemctl restart docker $ sudo systemctl restart docker
``` ```
### Windows 10 注意:如果您之前查看旧教程,修改了 `docker.service` 文件内容,请去掉您添加的内容(`--registry-mirror=https://jxus37ad.mirror.aliyuncs.com`),这里不再赘述。
对于使用 WINDOWS 10 的系统,在系统右下角托盘图标内右键菜单选择 `Settings`,打开配置窗口后左侧导航菜单选择 `Docker Daemon`。编辑窗口内的JSON串填写如阿里云、DaoCloud之类的加速器地址
```bash ### Windows 10
对于使用 Windows 10 的系统,在系统右下角托盘图标内右键菜单选择 `Settings`,打开配置窗口后左侧导航菜单选择 `Docker Daemon`。编辑窗口内的JSON串填写加速器地址
```json
{ {
"registry-mirrors": [ "registry-mirrors": [
"https://sr5arhkn.mirror.aliyuncs.com", "https://sr5arhkn.mirror.aliyuncs.com",
"http://14d216f4.m.daocloud.io" "http://14d216f4.m.daocloud.io"
], ]
"insecure-registries": []
} }
``` ```
编辑完成点击Apply保存后Docker服务会重新启动。
编辑完成,点击 Apply 保存后 Docker 服务会重新启动。
### macOS ### macOS
对于macOS的用户如果你使用的是**Docker for Mac**,那配置起来很简单。在任务栏点击应用图标 -> Perferences... -> Daemon -> Registry mirrors。在列表中添加云服务商提供的加速器地址即可。修改完成之后点击`Apply & Restart`按钮Docker就会重启并应用配置的镜像地址了。 对于使用 macOS 的用户,在任务栏点击 Docker for mac 应用图标 -> Perferences... -> Daemon -> Registry mirrors。在列表中添加云服务商提供的加速器地址即可。修改完成之后点击 `Apply & Restart` 按钮Docker 就会重启并应用配置的镜像地址了。
### 检查加速器是否生效 ### 检查加速器是否生效
Linux系统下配置完加速器需要检查是否生效在命令行执行 `ps -ef | grep dockerd`,如果从结果中看到了配置的 `--registry-mirror` 参数说明配置成功。 配置加速器之后,如果拉取镜像仍然十分缓慢,请手动检查加速器配置是否生效,在命令行执行 `$ docker info`,如果从结果中看到了如下内容,说明配置成功。
```bash ```bash
$ sudo ps -ef | grep dockerd
root 5346 1 0 19:03 ? 00:00:00 /usr/bin/dockerd --registry-mirror=https://jxus37ad.mirror.aliyuncs.com
$
```
如果`Docker`版本大于1.13或17.05.0-ce也可以
```bash
$ sudo docker info|grep "Registry Mirrors" -A 1
Registry Mirrors: Registry Mirrors:
https://registry.docker-cn.com/ https://registry.docker-cn.com/
``` ```

View File

@ -18,7 +18,9 @@ Docker CE 可以安装在 64 位的 x86 平台或 ARM 平台上。Ubuntu 发行
旧版本的 Docker 称为 `docker` 或者 `docker-engine`,使用以下命令卸载旧版本: 旧版本的 Docker 称为 `docker` 或者 `docker-engine`,使用以下命令卸载旧版本:
```bash ```bash
$ sudo apt-get remove docker docker-engine docker.io $ sudo apt-get remove docker \
docker-engine \
docker.io
``` ```
#### Ubuntu 14.04 可选内核模块 #### Ubuntu 14.04 可选内核模块
@ -56,14 +58,14 @@ $ sudo apt-get install \
为了确认所下载软件包的合法性,需要添加软件源的 GPG 密钥。 为了确认所下载软件包的合法性,需要添加软件源的 GPG 密钥。
```bash ```bash
$ curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add - $ curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
``` ```
然后,我们需要向 `source.list` 中添加 Docker 软件源 然后,我们需要向 `source.list` 中添加 Docker 软件源
```bash ```bash
$ sudo add-apt-repository \ $ sudo add-apt-repository \
"deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \ "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) \ $(lsb_release -cs) \
stable" stable"
``` ```

View File

@ -1,6 +1,6 @@
## 什么是 Docker ## 什么是 Docker
Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 [2013 年 3 月以 Apache 2.0 授权协议开源][docker-soft],主要项目代码在 [GitHub](https://github.com/docker/docker) 上进行维护。Docker 项目后来还加入了 Linux 基金会,并成立推动 [开放容器联盟](https://www.opencontainers.org/)。 Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 [2013 年 3 月以 Apache 2.0 授权协议开源][docker-soft],主要项目代码在 [GitHub](https://github.com/moby/moby) 上进行维护。Docker 项目后来还加入了 Linux 基金会,并成立推动 [开放容器联盟](https://www.opencontainers.org/)。
Docker 自开源后受到广泛的关注和讨论,至今其 GitHub 项目已经超过 3 万 6 千个星标和一万多个 fork。甚至由于 Docker 项目的火爆,在 2013 年底,[dotCloud 公司决定改名为 Docker](https://blog.docker.com/2013/10/dotcloud-is-becoming-docker-inc/)。Docker 最初是在 Ubuntu 12.04 上开发实现的Red Hat 则从 RHEL 6.5 开始对 Docker 进行支持Google 也在其 PaaS 产品中广泛应用 Docker。 Docker 自开源后受到广泛的关注和讨论,至今其 GitHub 项目已经超过 3 万 6 千个星标和一万多个 fork。甚至由于 Docker 项目的火爆,在 2013 年底,[dotCloud 公司决定改名为 Docker](https://blog.docker.com/2013/10/dotcloud-is-becoming-docker-inc/)。Docker 最初是在 Ubuntu 12.04 上开发实现的Red Hat 则从 RHEL 6.5 开始对 Docker 进行支持Google 也在其 PaaS 产品中广泛应用 Docker。

View File

@ -1,2 +1,4 @@
# Docker 中的网络功能介绍 # Docker 中的网络功能介绍
Docker 允许通过外部访问容器或容器互联的方式来提供网络服务。 Docker 允许通过外部访问容器或容器互联的方式来提供网络服务。
Docker 在 1.13 版本引进了新的管理命令management commands在 Docker 1.13+ 推荐使用 `docker network` 子命令来管理 Docker 网络。

View File

@ -1,12 +1,13 @@
## Docker Hub ## Docker Hub
目前 Docker 官方维护了一个公共仓库 [Docker Hub](https://hub.docker.com/),其中已经包括了超过 15,000 的镜像。大部分需求,都可以通过在 Docker Hub 中直接下载镜像来实现。 目前 Docker 官方维护了一个公共仓库 [Docker Hub](https://hub.docker.com/),其中已经包括了超过 15,000 的镜像。大部分需求,都可以通过在 Docker Hub 中直接下载镜像来实现。
### 注册
你可以在 https://hub.docker.com 免费注册一个 Docker 账号。
### 登录 ### 登录
可以通过执行 `docker login` 命令来输入用户名、密码和邮箱来完成注册和登录。 可以通过执行 `docker login` 命令交互式的输入用户名及密码来完成在命令行界面的登录。
注册成功后,本地用户目录的 `.dockercfg` 中将保存用户的认证信息。 登录成功后,本地用户目录的 `.dockercfg` 中将保存用户的认证信息。
### 基本操作 ### 基本操作
用户无需登录即可通过 `docker search` 命令来查找官方仓库中的镜像,并利用 `docker pull` 命令来将它下载到本地。 你可以通过 `docker search` 命令来查找官方仓库中的镜像,并利用 `docker pull` 命令来将它下载到本地。
例如以 centos 为关键词进行搜索: 例如以 centos 为关键词进行搜索:
``` ```

View File

@ -9,12 +9,12 @@
#### 容器运行 #### 容器运行
在安装了 Docker 后,可以通过获取官方 registry 镜像来运行。 在安装了 Docker 后,可以通过获取官方 registry 镜像来运行。
``` ```
$ sudo docker run -d -p 5000:5000 registry $ docker run -d -p 5000:5000 registry
``` ```
这将使用官方的 registry 镜像来启动本地的私有仓库。 这将使用官方的 registry 镜像来启动本地的私有仓库。
用户可以通过指定参数来配置私有仓库位置,例如配置镜像存储到 Amazon S3 服务。 用户可以通过指定参数来配置私有仓库位置,例如配置镜像存储到 Amazon S3 服务。
``` ```
$ sudo docker run \ $ docker run \
-e SETTINGS_FLAVOR=s3 \ -e SETTINGS_FLAVOR=s3 \
-e AWS_BUCKET=acme-docker \ -e AWS_BUCKET=acme-docker \
-e STORAGE_PATH=/registry \ -e STORAGE_PATH=/registry \
@ -26,45 +26,27 @@ $ sudo docker run \
```` ````
此外,还可以指定本地路径(如 `/home/user/registry-conf` )下的配置文件。 此外,还可以指定本地路径(如 `/home/user/registry-conf` )下的配置文件。
``` ```
$ sudo docker run -d -p 5000:5000 -v /home/user/registry-conf:/registry-conf -e DOCKER_REGISTRY_CONFIG=/registry-conf/config.yml registry $ docker run -d \
-p 5000:5000 \
-v /home/user/registry-conf:/registry-conf \
-e DOCKER_REGISTRY_CONFIG=/registry-conf/config.yml \
registry
``` ```
默认情况下,仓库会被创建在容器的 `/var/lib/registry `v1 中是`/tmp/registry`)下。可以通过 `-v` 参数来将镜像文件存放在本地的指定路径。 默认情况下,仓库会被创建在容器的 `/var/lib/registry `v1 中是`/tmp/registry`)下。可以通过 `-v` 参数来将镜像文件存放在本地的指定路径。
例如下面的例子将上传的镜像放到 `/opt/data/registry` 目录。 例如下面的例子将上传的镜像放到 `/opt/data/registry` 目录。
``` ```
$ sudo docker run -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry $ docker run -d \
-p 5000:5000 \
-v /opt/data/registry:/var/lib/registry \
registry
``` ```
#### 本地安装 ### 在私有仓库上传、下载、搜索镜像
对于 Ubuntu 或 CentOS 等发行版,可以直接通过源安装。
* Ubuntu
```
$ sudo apt-get install -y build-essential python-dev libevent-dev python-pip liblzma-dev
$ sudo pip install docker-registry
```
* CentOS
```
$ sudo yum install -y python-devel libevent-devel python-pip gcc xz-devel
$ sudo python-pip install docker-registry
```
也可以从 [docker-registry](https://github.com/docker/docker-registry) 项目下载源码进行安装。
```
$ sudo apt-get install build-essential python-dev libevent-dev python-pip libssl-dev liblzma-dev libffi-dev
$ git clone https://github.com/docker/distribution
$ cd distribution
$ sudo docker build .
```
启动运行registry的容器
```
$ sudo docker run -d -p 5000:5000 --restart=always --name registry ${IMAGE_ID}
```
###在私有仓库上传、下载、搜索镜像
创建好私有仓库之后,就可以使用 `docker tag` 来标记一个镜像,然后推送它到仓库,别的机器上就可以下载下来了。例如私有仓库地址为 `192.168.7.26:5000` 创建好私有仓库之后,就可以使用 `docker tag` 来标记一个镜像,然后推送它到仓库,别的机器上就可以下载下来了。例如私有仓库地址为 `192.168.7.26:5000`
先在本机查看已有的镜像。 先在本机查看已有的镜像。
``` ```
$ sudo docker images $ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu latest ba5877dc9bec 6 weeks ago 192.7 MB ubuntu latest ba5877dc9bec 6 weeks ago 192.7 MB
ubuntu 14.04 ba5877dc9bec 6 weeks ago 192.7 MB ubuntu 14.04 ba5877dc9bec 6 weeks ago 192.7 MB
@ -72,7 +54,7 @@ ubuntu 14.04 ba5877dc9bec 6 week
使用`docker tag` 将 `ba58` 这个镜像标记为 `192.168.7.26:5000/test`(格式为 `docker tag IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]`)。 使用`docker tag` 将 `ba58` 这个镜像标记为 `192.168.7.26:5000/test`(格式为 `docker tag IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]`)。
``` ```
$ sudo docker tag ba58 192.168.7.26:5000/test $ docker tag ba58 192.168.7.26:5000/test
root ~ # docker images root ~ # docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.04 ba5877dc9bec 6 weeks ago 192.7 MB ubuntu 14.04 ba5877dc9bec 6 weeks ago 192.7 MB
@ -81,7 +63,7 @@ ubuntu latest ba5877dc9bec 6 week
``` ```
使用 `docker push` 上传标记的镜像。 使用 `docker push` 上传标记的镜像。
``` ```
$ sudo docker push 192.168.7.26:5000/test $ docker push 192.168.7.26:5000/test
The push refers to a repository [192.168.7.26:5000/test] (len: 1) The push refers to a repository [192.168.7.26:5000/test] (len: 1)
Sending image list Sending image list
Pushing repository 192.168.7.26:5000/test (1 tags) Pushing repository 192.168.7.26:5000/test (1 tags)
@ -102,7 +84,7 @@ $ curl http://192.168.7.26:5000/v1/search
现在可以到另外一台机器去下载这个镜像。 现在可以到另外一台机器去下载这个镜像。
``` ```
$ sudo docker pull 192.168.7.26:5000/test $ docker pull 192.168.7.26:5000/test
Pulling repository 192.168.7.26:5000/test Pulling repository 192.168.7.26:5000/test
ba5877dc9bec: Download complete ba5877dc9bec: Download complete
511136ea3c5a: Download complete 511136ea3c5a: Download complete
@ -110,38 +92,23 @@ ba5877dc9bec: Download complete
25f11f5fb0cb: Download complete 25f11f5fb0cb: Download complete
ebc34468f71d: Download complete ebc34468f71d: Download complete
2318d26665ef: Download complete 2318d26665ef: Download complete
$ sudo docker images $ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
192.168.7.26:5000/test latest ba5877dc9bec 6 weeks ago 192.7 MB 192.168.7.26:5000/test latest ba5877dc9bec 6 weeks ago 192.7 MB
``` ```
可以使用 [这个脚本](https://github.com/yeasy/docker_practice/raw/master/_local/push_images.sh) 批量上传本地的镜像到注册服务器中,默认是本地注册服务器 `127.0.0.1:5000`。例如: 可以使用 `docker-compose push` 批量上传本地的镜像到私有 Docker 仓库,这里以 `127.0.0.1:5000` 为例:
```
$ wget https://github.com/yeasy/docker_practice/raw/master/_local/push_images.sh; sudo chmod a+x push_images.sh 编写 `docker-compose.yml` 文件
$ ./push_images.sh ubuntu:latest centos:centos7
The registry server is 127.0.0.1 ```yaml
Uploading ubuntu:latest... version: "3.4"
The push refers to a repository [127.0.0.1:5000/ubuntu] (len: 1) services:
Sending image list
Pushing repository 127.0.0.1:5000/ubuntu (1 tags) ubuntu:
Image 511136ea3c5a already pushed, skipping image: 127.0.0.1:5000/ubuntu:latest
Image bfb8b5a2ad34 already pushed, skipping centos:
Image c1f3bdbd8355 already pushed, skipping image: 127.0.0.1:5000/centos:centos7
Image 897578f527ae already pushed, skipping
Image 9387bcc9826e already pushed, skipping
Image 809ed259f845 already pushed, skipping
Image 96864a7d2df3 already pushed, skipping
Pushing tag for rev [96864a7d2df3] on {http://127.0.0.1:5000/v1/repositories/ubuntu/tags/latest}
Untagged: 127.0.0.1:5000/ubuntu:latest
Done
Uploading centos:centos7...
The push refers to a repository [127.0.0.1:5000/centos] (len: 1)
Sending image list
Pushing repository 127.0.0.1:5000/centos (1 tags)
Image 511136ea3c5a already pushed, skipping
34e94e67e63a: Image successfully pushed
70214e5d0a90: Image successfully pushed
Pushing tag for rev [70214e5d0a90] on {http://127.0.0.1:5000/v1/repositories/centos/tags/centos7}
Untagged: 127.0.0.1:5000/centos:centos7
Done
``` ```
在该文件路径下执行 `docker-compose push` 即可将上面的两个镜像上传到私有仓库中。