mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-03-10 11:54:37 +00:00
Compare commits
51 Commits
ca011164c2
...
english
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dc0f1223a0 | ||
|
|
dad6b9f022 | ||
|
|
e049bf2741 | ||
|
|
e59b50b43b | ||
|
|
8888612782 | ||
|
|
aa431b9a79 | ||
|
|
500325b7c8 | ||
|
|
cba52767b7 | ||
|
|
dc3a1c92d5 | ||
|
|
2ae8979c5c | ||
|
|
41633ecf24 | ||
|
|
48bcb9470b | ||
|
|
d47f565e83 | ||
|
|
b54b5b0a0f | ||
|
|
6c8e710c53 | ||
|
|
27f495466d | ||
|
|
cc8c36b1a3 | ||
|
|
f4e21a70b1 | ||
|
|
a2cdfdfded | ||
|
|
3b0f3c0cb2 | ||
|
|
37581d3016 | ||
|
|
49fd7a94da | ||
|
|
0a8887957e | ||
|
|
3356aa627f | ||
|
|
f20936e0af | ||
|
|
247bbcdc59 | ||
|
|
efdc3de9e0 | ||
|
|
42bb1bd1a1 | ||
|
|
c5935658bb | ||
|
|
bc6d6c85e3 | ||
|
|
ff7d5976a7 | ||
|
|
3a3939686c | ||
|
|
1a966e2979 | ||
|
|
a7d3a8291f | ||
|
|
6f9a5cca90 | ||
|
|
a5b762c2ce | ||
|
|
3cdde73798 | ||
|
|
e9213ea244 | ||
|
|
2b6e28d6a9 | ||
|
|
0699e96e36 | ||
|
|
2069a436e1 | ||
|
|
7b808e4d3d | ||
|
|
a071218f77 | ||
|
|
c9ebe3da2b | ||
|
|
941e01623c | ||
|
|
d00b6e1911 | ||
|
|
3b959abf68 | ||
|
|
8280d40922 | ||
|
|
1c1d81bd49 | ||
|
|
4f48fc2066 | ||
|
|
3974a2de24 |
@@ -1,22 +0,0 @@
|
||||
// https://code.visualstudio.com/docs/remote/devcontainerjson-reference
|
||||
|
||||
{
|
||||
"image": "yeasy/docker_practice:latest",
|
||||
"mounts": [
|
||||
"source=dp-code-remote-cache,target=/root/.vscode-server,type=volume"
|
||||
],
|
||||
"settings": {
|
||||
"terminal.integrated.shell.linux": "/bin/sh"
|
||||
},
|
||||
"forwardPorts": [
|
||||
4000
|
||||
],
|
||||
"runArgs": [
|
||||
"--cap-add=SYS_ADMIN"
|
||||
],
|
||||
"postStartCommand": [
|
||||
"sh",
|
||||
"-cx",
|
||||
"pwd ; cd /workspaces/docker_practice ; mkdir -p ${PWD}/node_modules; mkdir -p ${PWD}/_book; mount --bind /srv/gitbook/node_modules ${PWD}/node_modules ; mount --bind /mnt ${PWD}/_book"
|
||||
]
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
echo
|
||||
echo
|
||||
echo "Please open your browser: 127.0.0.1:4000"
|
||||
echo
|
||||
echo "欢迎加入 QQ 群:【 145983035 】 分享 Docker 资源,交流 Docker 技术"
|
||||
echo
|
||||
echo
|
||||
|
||||
exec nginx -g "daemon off;"
|
||||
39
.github/CODEOWNERS
vendored
39
.github/CODEOWNERS
vendored
@@ -1,39 +0,0 @@
|
||||
* @yeasy @khs1994
|
||||
/.github/* @khs1994
|
||||
/.travis/* @khs1994
|
||||
/.vuepress/* @khs1994
|
||||
/advanced_network/* @yeasy @khs1994
|
||||
/appendix/* @yeasy @khs1994
|
||||
/archive/* @khs1994
|
||||
/basic_concept/* @yeasy @khs1994
|
||||
/buildx/* @khs1994
|
||||
/cases/* @yeasy @khs1994
|
||||
/cloud/* @khs1994
|
||||
/compose/* @yeasy @khs1994
|
||||
/container/* @yeasy @khs1994
|
||||
/coreos/* @khs1994
|
||||
/data_management/* @khs1994
|
||||
/etcd/* @khs1994
|
||||
/IDE/* @khs1994
|
||||
/image/* @yeasy @khs1994
|
||||
/install/* @khs1994
|
||||
/introduction/* @yeasy @khs1994
|
||||
/kubernetes/* @yeasy @khs1994
|
||||
/network/* @yeasy @khs1994
|
||||
/opensource/* @khs1994
|
||||
/repository/* @khs1994
|
||||
/security/* @yeasy @khs1994
|
||||
/underly/* @yeasy @khs1994
|
||||
/.drone.yml @khs1994
|
||||
/.editorconfig/ @khs1994
|
||||
/.gitattributes @khs1994
|
||||
/.gitignore @khs1994
|
||||
/_config.yml @yeasy @khs1994
|
||||
/book.json @yeasy @khs1994
|
||||
/CHANGELOG.md @yeasy @khs1994
|
||||
/CONTRIBUTING.md @yeasy @khs1994
|
||||
/docker-compose.yml @khs1994
|
||||
/manifest @khs1994
|
||||
/package.json @khs1994
|
||||
/README.md @yeasy @khs1994
|
||||
/SUMMARY.md @yeasy @khs1994
|
||||
13
.github/FUNDING.yml
vendored
13
.github/FUNDING.yml
vendored
@@ -1,13 +0,0 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
github: yeasy
|
||||
patreon: # Replace with a single Patreon username
|
||||
open_collective: # Replace with a single Open Collective username
|
||||
ko_fi: # Replace with a single Ko-fi username
|
||||
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||
liberapay: # Replace with a single Liberapay username
|
||||
issuehunt: # Replace with a single IssueHunt username
|
||||
otechie: # Replace with a single Otechie username
|
||||
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
|
||||
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
|
||||
8
.github/ISSUE_TEMPLATE/Bug_report.md
vendored
8
.github/ISSUE_TEMPLATE/Bug_report.md
vendored
@@ -21,11 +21,11 @@ about: Create a report to help us improve
|
||||
* [x] Others (Pls describe below)
|
||||
|
||||
### Docker Version
|
||||
<!--如果你的 Docker 版本低于 20.10 请尽可能升级到该版本,保留你的 Docker 版本,其他选项删除-->
|
||||
<!--if Docker version under 20.10, please upgrade Docker to 20.10-->
|
||||
<!--如果你的 Docker 版本低于 19.03 请尽可能升级到该版本,保留你的 Docker 版本,其他选项删除-->
|
||||
<!--if Docker version under 19.03, please upgrade Docker to 19.03-->
|
||||
|
||||
* [x] Test (v20.10)
|
||||
* [x] Stable (v20.10)
|
||||
* [x] Edge (v19.03)
|
||||
* [x] Stable (v19.03)
|
||||
* [x] 1.13.0 or Before
|
||||
|
||||
### Problem Description
|
||||
|
||||
8
.github/ISSUE_TEMPLATE/Custom.md
vendored
8
.github/ISSUE_TEMPLATE/Custom.md
vendored
@@ -21,11 +21,11 @@ about: Create a issue about Docker
|
||||
* [x] Others (Pls describe below)
|
||||
|
||||
### Docker Version
|
||||
<!--如果你的 Docker 版本低于 20.10 请尽可能升级到该版本,保留你的 Docker 版本,其他选项删除-->
|
||||
<!--if Docker version under 20.10, please upgrade Docker to 20.10-->
|
||||
<!--如果你的 Docker 版本低于 19.03 请尽可能升级到该版本,保留你的 Docker 版本,其他选项删除-->
|
||||
<!--if Docker version under 19.03, please upgrade Docker to 19.03-->
|
||||
|
||||
* [x] Test (v20.10)
|
||||
* [x] Stable (v20.10)
|
||||
* [x] Edge (v19.03)
|
||||
* [x] Stable (v19.03)
|
||||
* [x] 1.13.0 or Before
|
||||
|
||||
### Problem Description
|
||||
|
||||
4
.github/PULL_REQUEST_TEMPLATE.md
vendored
4
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -3,7 +3,7 @@
|
||||
See [CONTRIBUTING](CONTRIBUTING.md) for contribution guidelines.
|
||||
-->
|
||||
|
||||
**Proposed changes (Mandatory)**
|
||||
### Proposed changes (Mandatory)
|
||||
|
||||
<!--
|
||||
Tell us what you did and why:
|
||||
@@ -13,7 +13,7 @@
|
||||
And details in other paragraphs.
|
||||
-->
|
||||
|
||||
**Fix issues (Optional)**
|
||||
### Fix issues (Optional)
|
||||
|
||||
<!--
|
||||
Tell us what issues you fixed, e.g., fix #123
|
||||
|
||||
65
.github/workflows/check-link.yml
vendored
65
.github/workflows/check-link.yml
vendored
@@ -1,65 +0,0 @@
|
||||
name: Check link
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
check-link:
|
||||
name: check-link
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.1
|
||||
# search Issues :-(
|
||||
- run: |
|
||||
docker run -i --rm \
|
||||
-v $PWD:/mnt:ro \
|
||||
dkhamsing/awesome_bot \
|
||||
--white-list "localhost","0.0.0.0",\
|
||||
"server","example.com","docker",\
|
||||
"docker.domain.com","YourIP","register",\
|
||||
"172.16.238.100","172.16.238.101","172.16.238.102",\
|
||||
"192.168.199.100",\
|
||||
"github.com/settings",\
|
||||
"github.com/docker/compose/releases/download",\
|
||||
"github.com/etcd-io/etcd/releases/download",\
|
||||
"github.com/tianon/gosu/releases/download",\
|
||||
"github.com/yeasy/docker_practice",\
|
||||
"github.com/AliyunContainerService/k8s-for-docker-desktop/raw",\
|
||||
"dl-cdn.alpinelinux.org/alpine/edge/testing",\
|
||||
"www.w3.org/1999/xhtml",\
|
||||
"cr.console.aliyun.com",\
|
||||
"cloud.tencent.com",\
|
||||
"nodejs.org/dist/",\
|
||||
"c.163.com/hub",\
|
||||
"drone.yeasy.com",\
|
||||
"docs.docker.com",\
|
||||
"dockerhub.azk8s.cn",\
|
||||
"reg-mirror.qiniu.com",\
|
||||
"registry.docker-cn.com",\
|
||||
"mirror.ccs.tencentyun.com",\
|
||||
"vuepress.mirror.docker-practice.com",\
|
||||
"mc.qcloudimg.com/static/img",\
|
||||
"www.daocloud.io/mirror",\
|
||||
"download.docker.com",\
|
||||
"www.ubuntu.com",\
|
||||
"archive.ubuntu.com",\
|
||||
"security.ubuntu.com/ubuntu",\
|
||||
"nginx.com",\
|
||||
"img.shields.io/github/release/yeasy/docker_practice",\
|
||||
"launchpad.net",\
|
||||
"www.w3.org/1999",\
|
||||
"chat.freenode.net",\
|
||||
"en.wikipedia.org/wiki/UnionFS",\
|
||||
"product.china-pub.com",\
|
||||
"union-click.jd.com",\
|
||||
"x.x.x.x/base",\
|
||||
"x.x.x.x:9090",\
|
||||
"yeasy.gitbooks.io",\
|
||||
"download.fastgit.org",\
|
||||
"www.aliyun.com" \
|
||||
--allow-dupe \
|
||||
--skip-save-results \
|
||||
-t 10 \
|
||||
`find . \( -path "./mesos" -o -path "./swarm_mode" \) -prune -o -name "*.md" -exec ls {} \;`
|
||||
name: check-link
|
||||
timeout-minutes: 25
|
||||
150
.github/workflows/ci.yaml
vendored
150
.github/workflows/ci.yaml
vendored
@@ -1,156 +1,18 @@
|
||||
name: CI
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
workflow_dispatch:
|
||||
|
||||
defaults:
|
||||
run:
|
||||
shell: bash --noprofile --norc -exo pipefail {0}
|
||||
name: CI
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Build
|
||||
name: Build GitBook
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.1
|
||||
- name: Build Gitbook
|
||||
- uses: actions/checkout@master
|
||||
with:
|
||||
fetch-depth: 2
|
||||
- name: Build
|
||||
uses: docker://yeasy/docker_practice
|
||||
with:
|
||||
args: build
|
||||
- name: Build Gitbook Docker Image
|
||||
if: github.repository == 'docker-practice/docker_practice'
|
||||
run: |
|
||||
sudo chmod -R 777 _book
|
||||
echo "FROM nginx:alpine" >> Dockerfile
|
||||
echo "COPY _book /usr/share/nginx/html" >> Dockerfile
|
||||
echo "COPY .docker/docker-entrypoint.sh /" >> Dockerfile
|
||||
echo "ENTRYPOINT [\"/docker-entrypoint.sh\"]" >> Dockerfile
|
||||
|
||||
export VCS_REF=`git rev-parse --short HEAD`
|
||||
|
||||
docker build \
|
||||
-t dockerpracticesig/docker_practice \
|
||||
-t dockerpracticesig/docker_practice:gitbook \
|
||||
--label org.opencontainers.image.revision=$VCS_REF \
|
||||
--label org.opencontainers.image.source="https://github.com/yeasy/docker_practice" \
|
||||
--label maintainer="https://github.com/docker-practice" \
|
||||
.
|
||||
|
||||
docker run -d --rm -p 4000:80 dockerpracticesig/docker_practice
|
||||
|
||||
sleep 5
|
||||
|
||||
echo "::group::Test"
|
||||
curl 127.0.0.1:4000
|
||||
echo "::endgroup::"
|
||||
|
||||
echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
|
||||
docker push dockerpracticesig/docker_practice
|
||||
docker push dockerpracticesig/docker_practice:gitbook
|
||||
env:
|
||||
DOCKER_PASSWORD: ${{secrets.DOCKER_PASSWORD}}
|
||||
DOCKER_USERNAME: ${{secrets.DOCKER_USERNAME}}
|
||||
- name: Upload Gitbook dist
|
||||
uses: docker://pcit/pages
|
||||
if: github.repository == 'docker-practice/docker_practice'
|
||||
env:
|
||||
PCIT_EMAIL: khs1994@khs1994.com
|
||||
PCIT_GIT_TOKEN: ${{ secrets.PCIT_GIT_TOKEN }}
|
||||
PCIT_GIT_URL: github.com/docker-practice/zh-cn
|
||||
PCIT_KEEP_HISTORY: "true"
|
||||
PCIT_LOCAL_DIR: _book
|
||||
PCIT_MESSAGE: Build from yeasy/docker_practice@${{github.sha}}
|
||||
PCIT_TARGET_BRANCH: master
|
||||
PCIT_USERNAME: khs1994
|
||||
- name: vuepress
|
||||
run: |
|
||||
export NODE_OPTIONS=--openssl-legacy-provider
|
||||
sudo rm -rf _book
|
||||
npm i
|
||||
|
||||
git clone https://github.com/docker-practice/.vuepress .vuepress2
|
||||
cp -r .vuepress2/. .vuepress/
|
||||
rm -rf .vuepress2
|
||||
find . \( -path "./mesos" -o -path "./swarm_mode" -o -path "./node_modules" -o -path "./.vuepress" -o -path "./_book" -o -path "./CHANGELOG.md" -o -path "./CONTRIBUTING.md" \) -prune -o -name "*.md" -exec sed -i 'N;2a\<AdSenseTitle/>\n' {} \;
|
||||
|
||||
npx vuepress --version
|
||||
|
||||
npm run vuepress:build
|
||||
echo "vuepress.mirror.docker-practice.com" > .vuepress/dist/CNAME
|
||||
|
||||
cp -r _images .vuepress/dist
|
||||
cp -r advanced_network/_images .vuepress/dist/advanced_network
|
||||
cp -r appendix/_images .vuepress/dist/appendix
|
||||
cp -r cases/ci/drone/_images .vuepress/dist/cases/ci/drone
|
||||
cp -r cases/os/_images .vuepress/dist/cases/os
|
||||
cp -r cloud/_images .vuepress/dist/cloud
|
||||
cp -r data_management/_images .vuepress/dist/data_management
|
||||
cp -r etcd/_images .vuepress/dist/etcd
|
||||
cp -r image/_images .vuepress/dist/image
|
||||
cp -r install/_images .vuepress/dist/install
|
||||
cp -r introduction/_images .vuepress/dist/introduction
|
||||
cp -r kubernetes/_images .vuepress/dist/kubernetes
|
||||
cp -r underly/_images .vuepress/dist/underly
|
||||
|
||||
echo "include: [_images]" > .vuepress/dist/_config.yml
|
||||
- name: Upload Vuepress dist
|
||||
uses: docker://pcit/pages
|
||||
if: github.repository == 'docker-practice/docker_practice'
|
||||
env:
|
||||
PCIT_EMAIL: khs1994@khs1994.com
|
||||
PCIT_GIT_TOKEN: ${{ secrets.PCIT_GIT_TOKEN }}
|
||||
PCIT_GIT_URL: github.com/docker-practice/vuepress
|
||||
PCIT_KEEP_HISTORY: "true"
|
||||
PCIT_LOCAL_DIR: .vuepress/dist
|
||||
PCIT_MESSAGE: Build from yeasy/docker_practice@${{github.sha}}
|
||||
PCIT_TARGET_BRANCH: master
|
||||
PCIT_USERNAME: khs1994
|
||||
# - name: Set coding.net CNAME
|
||||
# run: |
|
||||
# echo "vuepress.mirror.docker-practice.com" > .vuepress/dist/CNAME
|
||||
# - name: Upload Vuepress dist to coding.net
|
||||
# uses: docker://pcit/pages
|
||||
# if: github.repository == 'docker-practice/docker_practice'
|
||||
# env:
|
||||
# PCIT_EMAIL: khs1994@khs1994.com
|
||||
# PCIT_GIT_TOKEN: ${{ secrets.CODING_GIT_TOKEN }}
|
||||
# PCIT_GIT_URL: e.coding.net/dpsigs/docker_practice
|
||||
# PCIT_KEEP_HISTORY: "true"
|
||||
# PCIT_LOCAL_DIR: .vuepress/dist
|
||||
# PCIT_MESSAGE: Build from yeasy/docker_practice@${{github.sha}}
|
||||
# PCIT_TARGET_BRANCH: master
|
||||
# PCIT_USERNAME: ptt0xjqzbke3
|
||||
- name: Build vuepress docker image
|
||||
if: github.repository == 'docker-practice/docker_practice'
|
||||
run: |
|
||||
sudo rm -rf .vuepress/dist/.git
|
||||
|
||||
echo "FROM nginx:alpine" > Dockerfile
|
||||
echo "COPY .vuepress/dist /usr/share/nginx/html" >> Dockerfile
|
||||
echo "COPY .docker/docker-entrypoint.sh /" >> Dockerfile
|
||||
echo "ENTRYPOINT [\"/docker-entrypoint.sh\"]" >> Dockerfile
|
||||
|
||||
echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
|
||||
|
||||
VCS_REF=`git rev-parse --short HEAD`
|
||||
|
||||
docker build -t dockerpracticesig/docker_practice:vuepress \
|
||||
--label org.opencontainers.image.revision=$VCS_REF \
|
||||
--label org.opencontainers.image.source="https://github.com/yeasy/docker_practice" \
|
||||
--label maintainer="https://github.com/docker-practice" \
|
||||
.
|
||||
|
||||
docker push dockerpracticesig/docker_practice:vuepress
|
||||
|
||||
docker run -it --rm -d -p 4001:80 dockerpracticesig/docker_practice:vuepress
|
||||
|
||||
sleep 5
|
||||
|
||||
echo "::group::Test"
|
||||
curl 127.0.0.1:4001
|
||||
echo "::endgroup::"
|
||||
env:
|
||||
DOCKER_PASSWORD: ${{secrets.DOCKER_PASSWORD}}
|
||||
DOCKER_USERNAME: ${{secrets.DOCKER_USERNAME}}
|
||||
|
||||
4
.gitignore
vendored
4
.gitignore
vendored
@@ -6,8 +6,4 @@ _book/
|
||||
*.swp
|
||||
*.edx
|
||||
.DS_Store
|
||||
|
||||
node_modules/
|
||||
package-lock.json
|
||||
|
||||
docker-compose.override.yml
|
||||
|
||||
53
.travis.yml
Normal file
53
.travis.yml
Normal file
@@ -0,0 +1,53 @@
|
||||
language: bash
|
||||
|
||||
services:
|
||||
- docker
|
||||
|
||||
before_install:
|
||||
- openssl aes-256-cbc -K $encrypted_6cc8cff04075_key -iv $encrypted_6cc8cff04075_iv
|
||||
-in .travis/id_rsa.enc -out ~/.ssh/id_rsa -d
|
||||
- chmod 600 ~/.ssh/id_rsa
|
||||
- export TZ='Asia/Shanghai'
|
||||
- date
|
||||
- git config --global user.name "khs1994"
|
||||
- git config --global user.email "khs1994@khs1994.com"
|
||||
|
||||
script:
|
||||
- docker run -it --rm -v $PWD:/srv/gitbook-src yeasy/docker_practice build
|
||||
|
||||
after_success:
|
||||
- sudo chmod -R 777 _book
|
||||
|
||||
- echo "FROM nginx:alpine" >> Dockerfile
|
||||
- echo "COPY _book /usr/share/nginx/html" >> Dockerfile
|
||||
|
||||
- echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
|
||||
|
||||
- docker build -t dockerpracticesig/docker_practice:us-en .
|
||||
- docker run -dit --rm -p 4000:80 dockerpracticesig/docker_practice:us-en
|
||||
|
||||
- sleep 5
|
||||
- curl 127.0.0.1:4000
|
||||
|
||||
- docker push dockerpracticesig/docker_practice:us-en
|
||||
|
||||
- cd _book
|
||||
- git init
|
||||
- git remote add origin "$DEPLOY_REPO"
|
||||
- git add .
|
||||
- COMMIT=`date "+%F %T"`
|
||||
- git commit -m "Travis CI Site updated $COMMIT"
|
||||
- git push -f origin master:"$DEPLOY_BRANCH"
|
||||
|
||||
env:
|
||||
global:
|
||||
- DEPLOY_BRANCH: master
|
||||
- DEPLOY_REPO: git@github.com:docker-practice/us-en.git
|
||||
|
||||
addons:
|
||||
ssh_known_hosts:
|
||||
- github.com
|
||||
|
||||
branches:
|
||||
only:
|
||||
- english
|
||||
@@ -1,4 +1,4 @@
|
||||
FROM node:14.4.0-alpine
|
||||
FROM node:alpine
|
||||
|
||||
ENV TZ=Asia/Shanghai
|
||||
|
||||
@@ -8,8 +8,8 @@ COPY book.json book.json
|
||||
|
||||
COPY docker-entrypoint.sh /usr/local/bin/
|
||||
|
||||
RUN set -x && apk add --no-cache \
|
||||
tzdata bash \
|
||||
RUN apk add --no-cache \
|
||||
tzdata \
|
||||
&& npm install -g gitbook-cli \
|
||||
&& gitbook install \
|
||||
&& ln -s /usr/local/bin/docker-entrypoint.sh / \
|
||||
|
||||
@@ -13,11 +13,9 @@ cp -a . /srv/gitbook
|
||||
cd /srv/gitbook
|
||||
|
||||
main(){
|
||||
if [ "$1" = build ];then
|
||||
gitbook build && cp -a _book $srcDir && echo $START && date "+%F %T" && exit 0
|
||||
else
|
||||
exec gitbook serve
|
||||
fi
|
||||
if [ "$1" = build ];then gitbook build && cp -a _book $srcDir && echo $START && date "+%F %T" && exit 0; fi
|
||||
exec gitbook serve
|
||||
exit 0
|
||||
}
|
||||
|
||||
main $1 $2 $3
|
||||
|
||||
BIN
.travis/id_rsa.enc
Normal file
BIN
.travis/id_rsa.enc
Normal file
Binary file not shown.
3
.vuepress/.gitignore
vendored
3
.vuepress/.gitignore
vendored
@@ -1,3 +0,0 @@
|
||||
/*
|
||||
!.gitignore
|
||||
!config.js
|
||||
@@ -1,462 +0,0 @@
|
||||
const { config } = require('vuepress-theme-hope')
|
||||
|
||||
module.exports = config({
|
||||
title: 'Docker 从入门到实践',
|
||||
base: '/',
|
||||
head: [['script', {}, `
|
||||
var _hmt = _hmt || [];
|
||||
(function() {
|
||||
var hm = document.createElement("script");
|
||||
hm.src = "//hm.baidu.com/hm.js?81a3490c9cd141dbcf6d00bc18b6edae";
|
||||
var s = document.getElementsByTagName("script")[0];
|
||||
s.parentNode.insertBefore(hm, s);
|
||||
})();
|
||||
`],
|
||||
[
|
||||
'script', {}, `
|
||||
(function(){
|
||||
var bp = document.createElement('script');
|
||||
var curProtocol = window.location.protocol.split(':')[0];
|
||||
if (curProtocol === 'https') {
|
||||
bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
|
||||
}
|
||||
else {
|
||||
bp.src = 'http://push.zhanzhang.baidu.com/push.js';
|
||||
}
|
||||
var s = document.getElementsByTagName("script")[0];
|
||||
s.parentNode.insertBefore(bp, s);
|
||||
})();
|
||||
`
|
||||
]
|
||||
],
|
||||
plugins: {
|
||||
// sitemap: {
|
||||
// hostname: 'https://vuepress.mirror.docker-practice.com'
|
||||
// },
|
||||
// 'git-log': {
|
||||
// additionalArgs: '--no-merge',
|
||||
// onlyFirstAndLastCommit: true,
|
||||
// },
|
||||
},
|
||||
locales: {
|
||||
"/": {
|
||||
lang: "zh-CN"
|
||||
}
|
||||
},
|
||||
themeConfig: {
|
||||
blog: false,
|
||||
// comment: false,
|
||||
comment: {
|
||||
type: "disable", // 使用 Valine
|
||||
appId: "...", // your appId
|
||||
appKey: "...", // your appKey
|
||||
},
|
||||
pageInfo: [
|
||||
// 'author',
|
||||
'reading-time',
|
||||
'word',
|
||||
],
|
||||
footer: {
|
||||
content: "Made with <a target='_blank' href='https://github.com/vuepress-theme-hope/vuepress-theme-hope'>vuepress-theme-hope</a>",
|
||||
display: true,
|
||||
copyright: false,
|
||||
},
|
||||
searchPlaceholder: 'Search',
|
||||
repo: 'yeasy/docker_practice',
|
||||
repoLabel: 'GitHub',
|
||||
repoDisplay: true,
|
||||
hostname: 'https://vuepress.mirror.docker-practice.com',
|
||||
// author: 'yeasy',
|
||||
mdEnhance: {
|
||||
lineNumbers: true,
|
||||
},
|
||||
git: {
|
||||
contributor: false,
|
||||
},
|
||||
themeColor: {
|
||||
blue: '#2196f3',
|
||||
// red: '#f26d6d',
|
||||
// green: '#3eaf7c',
|
||||
// orange: '#fb9b5f'
|
||||
},
|
||||
locales: {
|
||||
"/": {
|
||||
lang: "zh-CN"
|
||||
}
|
||||
},
|
||||
|
||||
darkmode: 'auto-switch',
|
||||
|
||||
//
|
||||
|
||||
showAds: true,
|
||||
|
||||
docsRepo: 'yeasy/docker_practice',
|
||||
docsDir: '/',
|
||||
docsBranch: 'master',
|
||||
editLinks: true,
|
||||
nav: [
|
||||
{
|
||||
text: '微信交流群',
|
||||
link: 'https://docker_practice.gitee.io/pic/dpsig-wechat.jpg',
|
||||
},
|
||||
{
|
||||
text: '小程序',
|
||||
link: 'https://docker_practice.gitee.io/pic/dp-wechat-miniprogram.jpg',
|
||||
},
|
||||
{
|
||||
text: '安装 Docker',
|
||||
link: '/install/',
|
||||
},
|
||||
{
|
||||
text: 'Docker 入门',
|
||||
link: '/'
|
||||
},
|
||||
{
|
||||
text: 'Docker 实战',
|
||||
link: '/cases/os/'
|
||||
},
|
||||
{
|
||||
text: 'CI/CD',
|
||||
link: '/cases/ci/'
|
||||
},
|
||||
{
|
||||
text: 'Compose',
|
||||
link: '/compose/',
|
||||
},
|
||||
{
|
||||
text: 'Kubernetes',
|
||||
link: '/kubernetes/',
|
||||
},
|
||||
{
|
||||
text: "云计算",
|
||||
link: "/cloud/",
|
||||
},
|
||||
// {
|
||||
// text: 'GitHub',
|
||||
// link: 'https://github.com/yeasy/docker_practice'
|
||||
// },
|
||||
// {
|
||||
// text: '捐赠',
|
||||
// link: ''
|
||||
// },
|
||||
{
|
||||
text: '云服务器99/元首年特惠',
|
||||
link: 'https://cloud.tencent.com/act/cps/redirect?redirect=1062&cps_key=3a5255852d5db99dcd5da4c72f05df61&from=console'
|
||||
},
|
||||
// {
|
||||
// text: '语言',
|
||||
// items: [{
|
||||
// text: 'English',
|
||||
// link: ''
|
||||
// }]
|
||||
// }
|
||||
],
|
||||
sidebar: {
|
||||
'/cloud/': [
|
||||
'intro',
|
||||
'tencentCloud',
|
||||
'alicloud',
|
||||
'aws',
|
||||
'summary',
|
||||
],
|
||||
'/kubernetes/': [
|
||||
'intro',
|
||||
'concepts',
|
||||
'design',
|
||||
{
|
||||
title: "部署 Kubernetes",
|
||||
collapsable: true,
|
||||
children: [
|
||||
"setup/",
|
||||
"setup/kubeadm",
|
||||
"setup/docker-desktop",
|
||||
"setup/systemd",
|
||||
"setup/dashboard",
|
||||
]
|
||||
},
|
||||
{
|
||||
title: "Kubernetes 命令行 kubectl",
|
||||
collapsable: true,
|
||||
children: [
|
||||
'kubectl/'
|
||||
]
|
||||
}
|
||||
],
|
||||
'/compose/': [
|
||||
'introduction',
|
||||
'v2',
|
||||
'install',
|
||||
'usage',
|
||||
'commands',
|
||||
'compose_file',
|
||||
'django',
|
||||
'rails',
|
||||
'wordpress',
|
||||
'lnmp',
|
||||
],
|
||||
'/install/': [
|
||||
'ubuntu',
|
||||
'debian',
|
||||
'fedora',
|
||||
'centos',
|
||||
'raspberry-pi',
|
||||
// 'offline',
|
||||
'mac',
|
||||
'windows',
|
||||
'mirror',
|
||||
'experimental',
|
||||
],
|
||||
'/cases/os/': [
|
||||
{
|
||||
title: "操作系统",
|
||||
collapsable: false,
|
||||
children: [
|
||||
'busybox',
|
||||
'alpine',
|
||||
'debian',
|
||||
'centos',
|
||||
'summary',
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "在 IDE 中使用 Docker",
|
||||
collapsable: false,
|
||||
children: [
|
||||
'/ide/',
|
||||
'/ide/vsCode',
|
||||
],
|
||||
},
|
||||
],
|
||||
'/cases/ci/': [
|
||||
'actions/',
|
||||
{
|
||||
title: "Drone",
|
||||
collapsable: true,
|
||||
children: [
|
||||
'drone/',
|
||||
'drone/install'
|
||||
]
|
||||
},
|
||||
],
|
||||
'/': [
|
||||
'/',
|
||||
'/CHANGELOG',
|
||||
'/CONTRIBUTING',
|
||||
{
|
||||
title: "Docker 简介",
|
||||
collapsable: false,
|
||||
children: [
|
||||
'introduction/',
|
||||
'introduction/what',
|
||||
'introduction/why',
|
||||
]
|
||||
}, {
|
||||
title: "基本概念",
|
||||
collapsable: false,
|
||||
children: [
|
||||
'basic_concept/',
|
||||
'basic_concept/image',
|
||||
'basic_concept/container',
|
||||
'basic_concept/repository'
|
||||
]
|
||||
},
|
||||
{
|
||||
title: "使用镜像",
|
||||
collapsable: false,
|
||||
children: [
|
||||
'image/',
|
||||
'image/pull',
|
||||
'image/list',
|
||||
'image/rm',
|
||||
'image/commit',
|
||||
'image/build',
|
||||
'image/other.md',
|
||||
'image/internal.md',
|
||||
]
|
||||
},
|
||||
{
|
||||
title: 'Dockerfile',
|
||||
collapsable: true,
|
||||
children: [
|
||||
"image/dockerfile/",
|
||||
'image/dockerfile/copy',
|
||||
'image/dockerfile/add',
|
||||
'image/dockerfile/cmd',
|
||||
'image/dockerfile/entrypoint',
|
||||
'image/dockerfile/env',
|
||||
'image/dockerfile/arg',
|
||||
'image/dockerfile/volume',
|
||||
'image/dockerfile/expose',
|
||||
'image/dockerfile/workdir',
|
||||
'image/dockerfile/user',
|
||||
'image/dockerfile/healthcheck',
|
||||
'image/dockerfile/label',
|
||||
'image/dockerfile/shell',
|
||||
'image/dockerfile/onbuild',
|
||||
'image/dockerfile/references',
|
||||
'image/multistage-builds/',
|
||||
'image/multistage-builds/laravel',
|
||||
'image/manifest',
|
||||
]
|
||||
}, {
|
||||
title: "操作容器",
|
||||
collapsable: false,
|
||||
children: [
|
||||
'container/',
|
||||
'container/run',
|
||||
'container/daemon',
|
||||
'container/stop',
|
||||
'container/attach_exec',
|
||||
'container/import_export',
|
||||
'container/rm',
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "Docker 仓库",
|
||||
collapsable: false,
|
||||
children: [
|
||||
'repository/',
|
||||
'repository/dockerhub',
|
||||
'repository/registry',
|
||||
'repository/registry_auth',
|
||||
'repository/nexus3_registry',
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "数据管理",
|
||||
collapsable: false,
|
||||
children: [
|
||||
'data_management/',
|
||||
'data_management/volume',
|
||||
'data_management/bind-mounts',
|
||||
],
|
||||
}, {
|
||||
title: "使用网络",
|
||||
collapsable: false,
|
||||
children: [
|
||||
'network/',
|
||||
'network/port_mapping',
|
||||
'network/linking',
|
||||
'network/dns',
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "高级网络配置",
|
||||
collapsable: true,
|
||||
children: [
|
||||
'advanced_network/',
|
||||
'advanced_network/quick_guide',
|
||||
'advanced_network/access_control',
|
||||
'advanced_network/port_mapping',
|
||||
'advanced_network/bridge',
|
||||
'advanced_network/example',
|
||||
'advanced_network/config_file',
|
||||
'advanced_network/ptp',
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "Swarm mode",
|
||||
collapsable: true,
|
||||
children: [
|
||||
'swarm_mode/',
|
||||
'swarm_mode/overview',
|
||||
'swarm_mode/create',
|
||||
'swarm_mode/deploy',
|
||||
'swarm_mode/stack',
|
||||
'swarm_mode/secret',
|
||||
'swarm_mode/config',
|
||||
'swarm_mode/rolling_update',
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "安全",
|
||||
collapsable: true,
|
||||
children: [
|
||||
'security/',
|
||||
'security/kernel_ns',
|
||||
'security/control_group',
|
||||
'security/daemon_sec',
|
||||
'security/kernel_capability',
|
||||
'security/other_feature',
|
||||
'security/summary',
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "底层实现",
|
||||
collapsable: true,
|
||||
children: [
|
||||
'underly/',
|
||||
'underly/arch',
|
||||
'underly/namespace',
|
||||
'underly/cgroups',
|
||||
'underly/ufs',
|
||||
'underly/container_format',
|
||||
'underly/network',
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "Docker Buildx",
|
||||
collapsable: false,
|
||||
children: [
|
||||
"buildx/",
|
||||
"buildx/buildkit",
|
||||
"buildx/buildx",
|
||||
"buildx/multi-arch-images",
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "Etcd",
|
||||
collapsable: true,
|
||||
children: [
|
||||
'etcd/',
|
||||
'etcd/intro',
|
||||
'etcd/install',
|
||||
'etcd/cluster',
|
||||
'etcd/etcdctl',
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "Fedora CoreOS",
|
||||
collapsable: true,
|
||||
children: [
|
||||
'coreos/',
|
||||
'coreos/intro',
|
||||
'coreos/install',
|
||||
],
|
||||
},
|
||||
'podman/',
|
||||
'appendix/faq/',
|
||||
{
|
||||
title: "热门镜像介绍",
|
||||
collapsable: true,
|
||||
children: [
|
||||
'appendix/repo/',
|
||||
'appendix/repo/ubuntu',
|
||||
'appendix/repo/centos',
|
||||
'appendix/repo/nginx',
|
||||
'appendix/repo/php',
|
||||
'appendix/repo/nodejs',
|
||||
'appendix/repo/mysql',
|
||||
'appendix/repo/wordpress',
|
||||
'appendix/repo/mongodb',
|
||||
'appendix/repo/redis',
|
||||
'appendix/repo/minio',
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "Docker 命令",
|
||||
collapsable: true,
|
||||
children: [
|
||||
'appendix/command/',
|
||||
'appendix/command/docker',
|
||||
'appendix/command/dockerd',
|
||||
]
|
||||
},
|
||||
'appendix/best_practices',
|
||||
'appendix/debug',
|
||||
'appendix/resources',
|
||||
],
|
||||
},
|
||||
}
|
||||
});
|
||||
15
CHANGELOG.md
15
CHANGELOG.md
@@ -1,22 +1,13 @@
|
||||
# 修订记录
|
||||
|
||||
* 1.3.0 2021-YY-DD
|
||||
* 全面支持 Docker v20.10 新版本
|
||||
* 新增 Docker Compose v2
|
||||
* Docker Hub 自动构建转为付费功能
|
||||
|
||||
* 1.2.0 2020-12-20
|
||||
* 错误修复
|
||||
## 主要修订记录
|
||||
|
||||
* 1.1.0 2019-12-31
|
||||
* 全面支持 Docker v19.03 新版本
|
||||
* 全面支持 v19.x 新版本
|
||||
* 增加 `BuildKit`
|
||||
* 增加 `docker buildx` 命令使用说明
|
||||
* 增加 `docker manifest` 命令使用说明
|
||||
* 移除 `Ubuntu 14.04` `Debian 8` `Debian 7`
|
||||
|
||||
* 1.0.0: 2018-12-31
|
||||
* 全面支持 Docker v18.x 新版本
|
||||
* 全面支持 v18.x 新版本
|
||||
* 添加如何调试 Docker
|
||||
* 错误修正
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# 如何贡献
|
||||
## 如何贡献项目
|
||||
|
||||
领取或创建新的 [Issue](https://github.com/yeasy/docker_practice/issues),如 [issue 235](https://github.com/yeasy/docker_practice/issues/235),添加自己为 `Assignee`。
|
||||
|
||||
|
||||
40
README.md
40
README.md
@@ -1,21 +1,25 @@
|
||||
# Docker — 从入门到实践
|
||||
# Docker — 从入门到实践(英文版)
|
||||
|
||||
[](https://github.com/yeasy/docker_practice) [](https://github.com/yeasy/docker_practice/releases) [](https://github.com/docker/docker-ce) [][1]
|
||||
[](https://github.com/yeasy/docker_practice) [](https://travis-ci.org/yeasy/docker_practice) [](https://github.com/yeasy/docker_practice/releases) [](https://github.com/docker/docker-ce) [](https://union-click.jd.com/jdc?e=&p=AyIGZRtYFAcXBFIZWR0yEgRQH1kXAhs3EUQDS10iXhBeGlcJDBkNXg9JHU4YDk5ER1xOGRNLGEEcVV8BXURFUFdfC0RVU1JRUy1OVxUBFwNXGVscMlVYLlAaXAV1Z1JHA0dWEHVXZTliY1QLWStaJQAWB10fXhwKEDdlG1wlUHzf462DsLMO0%2F%2BUjp2VIgZlG18RBBcCUBlbEAoTBWUcWxwySVI7HAhBBxEOBUgOFQYQUGUraxYyIjdVK1glQHxXUEhYEVEUUFQcC0IHGgRRSAgVARAPAhsLFgNCDl0ZWiUAEwZREg%3D%3D&t=W1dCFFlQCxxKQgFHREkdSVJKSQVJHFRXFk9FUlpGQUpLCVBaTFhbXQtWVmpSWRtYEAYQBVUS)
|
||||
|
||||
**v1.3.0**
|
||||
**v1.1.0**
|
||||
|
||||
| 语言 | - |
|
||||
| :------------- | :--- |
|
||||
| [简体中文](https://github.com/yeasy/docker_practice) | [阅读](https://vuepress.mirror.docker-practice.com/) |
|
||||
| 语言 | 构建状态 | - |
|
||||
| :------------- | :------------- | :--- |
|
||||
| [zh-hans](https://github.com/yeasy/docker_practice) | [](https://travis-ci.org/yeasy/docker_practice)| [阅读](https://docker_practice.gitee.io/zh-cn) |
|
||||
| [us-en](https://github.com/yeasy/docker_practice/tree/english) | [](https://travis-ci.org/yeasy/docker_practice)| [阅读](https://docker_practice.gitee.io/us-en) |
|
||||
| [zh-hant](https://github.com/yeasy/docker_practice/tree/zh-Hant) | [](https://travis-ci.org/yeasy/docker_practice)| [阅读](https://docker_practice.gitee.io/zh_hant) |
|
||||
|
||||
[Docker](https://www.docker.com) 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的维护效率,降低了云计算应用开发的成本!使用 Docker,可以让应用的部署、测试和分发都变得前所未有的高效和轻松!
|
||||
|
||||
无论是应用开发者、运维人员、还是其他信息技术从业人员,都有必要认识和掌握 Docker,节约有限的生命。
|
||||
|
||||
本书既适用于具备基础 Linux 知识的 Docker 初学者,也希望可供理解原理和实现的高级用户参考。同时,书中给出的实践案例,可供在进行实际部署时借鉴。前六章为基础内容,供用户理解 Docker 的基本概念和操作;7 ~ 9 章介绍包括数据管理、网络等高级操作;第 10 ~ 12 章介绍了容器生态中的几个核心项目;13、14 章讨论了关于 Docker 安全和实现技术等高级话题。后续章节则分别介绍包括 Etcd、Fedora CoreOS、Kubernetes、容器云等相关热门开源项目。最后,还展示了使用容器技术的典型的应用场景和实践案例。
|
||||
本书既适用于具备基础 Linux 知识的 Docker 初学者,也希望可供理解原理和实现的高级用户参考。同时,书中给出的实践案例,可供在进行实际部署时借鉴。前六章为基础内容,供用户理解 Docker 的基本概念和操作;7 ~ 9 章介绍包括数据管理、网络等高级操作;第 10 ~ 13 章介绍了容器生态中的几个核心项目;14、15 章讨论了关于 Docker 安全和实现技术等高级话题。后续章节则分别介绍包括 Etcd、CoreOS、Kubernetes、Mesos、容器云等相关热门开源项目。最后,还展示了使用容器技术的典型的应用场景和实践案例。
|
||||
|
||||
* 在线阅读:[docker-practice.com](https://vuepress.mirror.docker-practice.com/),[GitBook](https://yeasy.gitbook.io/docker_practice/),[Github](https://github.com/yeasy/docker_practice/blob/master/SUMMARY.md)
|
||||
* 离线阅读:[`$ docker run -it --rm -p 4000:80 ccr.ccs.tencentyun.com/dockerpracticesig/docker_practice:vuepress`](https://github.com/yeasy/docker_practice/wiki/%E7%A6%BB%E7%BA%BF%E9%98%85%E8%AF%BB%E5%8A%9F%E8%83%BD%E8%AF%A6%E8%A7%A3)
|
||||
* 在线阅读:[docker-practice.com](https://docker-practice.com/),[GitBook](https://yeasy.gitbooks.io/docker_practice/content/),[Github](https://github.com/yeasy/docker_practice/blob/master/SUMMARY.md),[GitBook 国内镜像](https://docker_practice.gitee.io/zh-cn),[GitBook 英文版国内镜像](https://docker_practice.gitee.io/us_en),[国内镜像](https://github.com/yeasy/docker_practice/wiki/%E9%A1%B9%E7%9B%AE%E5%9B%BD%E5%86%85%E9%95%9C%E5%83%8F)
|
||||
* 下载:[pdf](https://github.com/yeasy/docker_practice/wiki/%E4%B8%8B%E8%BD%BD),[epub](https://github.com/yeasy/docker_practice/wiki/%E4%B8%8B%E8%BD%BD)
|
||||
* [离线阅读 `$ docker run -it --rm -p 4000:80 dockerpracticesig/docker_practice`](https://github.com/yeasy/docker_practice/wiki/%E7%A6%BB%E7%BA%BF%E9%98%85%E8%AF%BB%E5%8A%9F%E8%83%BD%E8%AF%A6%E8%A7%A3)
|
||||
* [英文翻译](https://github.com/yeasy/docker_practice/issues/363)
|
||||
|
||||
Docker 自身仍在快速发展中,生态环境也在蓬勃成长。建议初学者使用最新稳定版本的 Docker 进行学习实践。欢迎 [参与项目维护](CONTRIBUTING.md)。
|
||||
|
||||
@@ -25,19 +29,13 @@ Docker 自身仍在快速发展中,生态环境也在蓬勃成长。建议初
|
||||
## 微信小程序
|
||||
|
||||
<p align="center">
|
||||
<img width="200" src="https://docker_practice.gitee.io/pic/dp-wechat-miniprogram.jpg">
|
||||
<img width="200" src="https://user-images.githubusercontent.com/16733187/49682252-3ac4c500-faec-11e8-86ab-eafe0139be6b.jpg">
|
||||
</p>
|
||||
|
||||
<p align="center"><strong>微信扫码 随时随地阅读~</strong></p>
|
||||
|
||||
## 技术交流
|
||||
|
||||
<p align="center">
|
||||
<img width="200" src="https://docker_practice.gitee.io/pic/dpsig-wechat.jpg">
|
||||
</p>
|
||||
|
||||
<p align="center"><strong>微信扫码 加入群聊~ 或者微信添加 <code>dpsigs</code> 邀请入群</strong></p>
|
||||
|
||||
欢迎加入 Docker 技术交流 QQ 群,分享 Docker 资源,交流 Docker 技术。
|
||||
|
||||
* QQ 群 I (已满):341410255
|
||||
@@ -51,15 +49,15 @@ Docker 自身仍在快速发展中,生态环境也在蓬勃成长。建议初
|
||||
* QQ 群 IX (已满):571502246
|
||||
* QQ 群 X (可加):145983035
|
||||
|
||||
>如果有容器技术相关的疑问,请通过 [Issues](https://github.com/yeasy/docker_practice/issues/new/choose) 来提出。
|
||||
>如果有问题,请通过 [Issues](https://github.com/yeasy/docker_practice/issues/new/choose) 来提出。
|
||||
|
||||
## 进阶学习
|
||||
|
||||
[][1]
|
||||
[](https://union-click.jd.com/jdc?e=&p=AyIGZRtYFAcXBFIZWR0yEgRQH1kXAhs3EUQDS10iXhBeGlcJDBkNXg9JHU4YDk5ER1xOGRNLGEEcVV8BXURFUFdfC0RVU1JRUy1OVxUBFwNXGVscMlVYLlAaXAV1Z1JHA0dWEHVXZTliY1QLWStaJQAWB10fXhwKEDdlG1wlUHzf462DsLMO0%2F%2BUjp2VIgZlG18RBBcCUBlbEAoTBWUcWxwySVI7HAhBBxEOBUgOFQYQUGUraxYyIjdVK1glQHxXUEhYEVEUUFQcC0IHGgRRSAgVARAPAhsLFgNCDl0ZWiUAEwZREg%3D%3D&t=W1dCFFlQCxxKQgFHREkdSVJKSQVJHFRXFk9FUlpGQUpLCVBaTFhbXQtWVmpSWRtYEAYQBVUS)
|
||||
|
||||
《[Docker 技术入门与实战][1]》第三版已经面世,介绍最新的容器技术栈,欢迎大家阅读使用并反馈建议。
|
||||
《[Docker 技术入门与实战](https://union-click.jd.com/jdc?e=&p=AyIGZRtYFAcXBFIZWR0yEgRQH1kXAhs3EUQDS10iXhBeGlcJDBkNXg9JHU4YDk5ER1xOGRNLGEEcVV8BXURFUFdfC0RVU1JRUy1OVxUBFwNXGVscMlVYLlAaXAV1Z1JHA0dWEHVXZTliY1QLWStaJQAWB10fXhwKEDdlG1wlUHzf462DsLMO0%2F%2BUjp2VIgZlG18RBBcCUBlbEAoTBWUcWxwySVI7HAhBBxEOBUgOFQYQUGUraxYyIjdVK1glQHxXUEhYEVEUUFQcC0IHGgRRSAgVARAPAhsLFgNCDl0ZWiUAEwZREg%3D%3D&t=W1dCFFlQCxxKQgFHREkdSVJKSQVJHFRXFk9FUlpGQUpLCVBaTFhbXQtWVmpSWRtYEAYQBVUS)》第三版已经面世,介绍最新的容器技术栈,欢迎大家阅读使用并反馈建议。
|
||||
|
||||
* [京东图书][1]
|
||||
* [京东图书](https://union-click.jd.com/jdc?e=&p=AyIGZRtYFAcXBFIZWR0yEgRQH1kXAhs3EUQDS10iXhBeGlcJDBkNXg9JHU4YDk5ER1xOGRNLGEEcVV8BXURFUFdfC0RVU1JRUy1OVxUBFwNXGVscMlVYLlAaXAV1Z1JHA0dWEHVXZTliY1QLWStaJQAWB10fXhwKEDdlG1wlUHzf462DsLMO0%2F%2BUjp2VIgZlG18RBBcCUBlbEAoTBWUcWxwySVI7HAhBBxEOBUgOFQYQUGUraxYyIjdVK1glQHxXUEhYEVEUUFQcC0IHGgRRSAgVARAPAhsLFgNCDl0ZWiUAEwZREg%3D%3D&t=W1dCFFlQCxxKQgFHREkdSVJKSQVJHFRXFk9FUlpGQUpLCVBaTFhbXQtWVmpSWRtYEAYQBVUS)
|
||||
* [China-Pub](http://product.china-pub.com/8052127)
|
||||
|
||||
## 鼓励项目
|
||||
@@ -69,5 +67,3 @@ Docker 自身仍在快速发展中,生态环境也在蓬勃成长。建议初
|
||||
</p>
|
||||
|
||||
<p align="center"><strong>欢迎鼓励项目一杯 coffee~</strong></p>
|
||||
|
||||
[1]: https://union-click.jd.com/jdc?e=&p=JF8AANADIgZlGF0VAxUDVBJdHDISBFAfWRcCGzcRRANLXSJeEF4aVwkMGQ1eD0kdSVJKSQVJHBIEUB9ZFwIbGAxeB0gyS34PbFlHVHNkI0MQEAoIcSxyBWFLRAtZK1olABYHXR9eHAoQN2UbXCVQfN_jrYOwsw7T_5SOnZUiBmUbXBYBFwBVG14UBBAAZRxbHDJJUjscCEEHEQ4FSA4VBhBQZStrFjIiN1UrWCVAfARQT1gQA0cFAEwOEAcRDlMTDEALQAFTEwwRUhMAUR1cJQATBlES
|
||||
|
||||
321
SUMMARY.md
321
SUMMARY.md
@@ -1,172 +1,155 @@
|
||||
# [Docker — 从入门到实践](https://github.com/yeasy/docker_practice/blob/master/SUMMARY.md)
|
||||
# [Docker — 从入门到实践(英文版)](https://github.com/yeasy/docker_practice/blob/english/SUMMARY.md)
|
||||
|
||||
* [前言](README.md)
|
||||
* [修订记录](CHANGELOG.md)
|
||||
* [如何贡献](CONTRIBUTING.md)
|
||||
* [Docker 简介](introduction/README.md)
|
||||
* [什么是 Docker](introduction/what.md)
|
||||
* [为什么要用 Docker](introduction/why.md)
|
||||
* [基本概念](basic_concept/README.md)
|
||||
* [镜像](basic_concept/image.md)
|
||||
* [容器](basic_concept/container.md)
|
||||
* [仓库](basic_concept/repository.md)
|
||||
* [安装 Docker](install/README.md)
|
||||
* [Ubuntu](install/ubuntu.md)
|
||||
* [Debian](install/debian.md)
|
||||
* [Fedora](install/fedora.md)
|
||||
* [CentOS](install/centos.md)
|
||||
* [Raspberry Pi](install/raspberry-pi.md)
|
||||
* [Linux 离线安装](install/offline.md)
|
||||
* [macOS](install/mac.md)
|
||||
* [Windows 10](install/windows.md)
|
||||
* [镜像加速器](install/mirror.md)
|
||||
* [开启实验特性](install/experimental.md)
|
||||
* [使用镜像](image/README.md)
|
||||
* [获取镜像](image/pull.md)
|
||||
* [列出镜像](image/list.md)
|
||||
* [删除本地镜像](image/rm.md)
|
||||
* [利用 commit 理解镜像构成](image/commit.md)
|
||||
* [使用 Dockerfile 定制镜像](image/build.md)
|
||||
* [Dockerfile 指令详解](image/dockerfile/README.md)
|
||||
* [COPY 复制文件](image/dockerfile/copy.md)
|
||||
* [ADD 更高级的复制文件](image/dockerfile/add.md)
|
||||
* [CMD 容器启动命令](image/dockerfile/cmd.md)
|
||||
* [ENTRYPOINT 入口点](image/dockerfile/entrypoint.md)
|
||||
* [ENV 设置环境变量](image/dockerfile/env.md)
|
||||
* [ARG 构建参数](image/dockerfile/arg.md)
|
||||
* [VOLUME 定义匿名卷](image/dockerfile/volume.md)
|
||||
* [EXPOSE 暴露端口](image/dockerfile/expose.md)
|
||||
* [WORKDIR 指定工作目录](image/dockerfile/workdir.md)
|
||||
* [USER 指定当前用户](image/dockerfile/user.md)
|
||||
* [HEALTHCHECK 健康检查](image/dockerfile/healthcheck.md)
|
||||
* [ONBUILD 为他人作嫁衣裳](image/dockerfile/onbuild.md)
|
||||
* [LABEL 为镜像添加元数据](image/dockerfile/label.md)
|
||||
* [SHELL 指令](image/dockerfile/shell.md)
|
||||
* [参考文档](image/dockerfile/references.md)
|
||||
* [Dockerfile 多阶段构建](image/multistage-builds/README.md)
|
||||
* [实战多阶段构建 Laravel 镜像](image/multistage-builds/laravel.md)
|
||||
* [构建多种系统架构支持的 Docker 镜像](image/manifest.md)
|
||||
* [其它制作镜像的方式](image/other.md)
|
||||
* [实现原理](image/internal.md)
|
||||
* [操作容器](container/README.md)
|
||||
* [启动](container/run.md)
|
||||
* [守护态运行](container/daemon.md)
|
||||
* [终止](container/stop.md)
|
||||
* [进入容器](container/attach_exec.md)
|
||||
* [导出和导入](container/import_export.md)
|
||||
* [删除](container/rm.md)
|
||||
* [访问仓库](repository/README.md)
|
||||
* [Docker Hub](repository/dockerhub.md)
|
||||
* [私有仓库](repository/registry.md)
|
||||
* [私有仓库高级配置](repository/registry_auth.md)
|
||||
* [Nexus 3](repository/nexus3_registry.md)
|
||||
* [数据管理](data_management/README.md)
|
||||
* [数据卷](data_management/volume.md)
|
||||
* [挂载主机目录](data_management/bind-mounts.md)
|
||||
* [使用网络](network/README.md)
|
||||
* [外部访问容器](network/port_mapping.md)
|
||||
* [容器互联](network/linking.md)
|
||||
* [配置 DNS](network/dns.md)
|
||||
* [高级网络配置](advanced_network/README.md)
|
||||
* [快速配置指南](advanced_network/quick_guide.md)
|
||||
* [容器访问控制](advanced_network/access_control.md)
|
||||
* [端口映射实现](advanced_network/port_mapping.md)
|
||||
* [配置 docker0 网桥](advanced_network/docker0.md)
|
||||
* [自定义网桥](advanced_network/bridge.md)
|
||||
* [工具和示例](advanced_network/example.md)
|
||||
* [编辑网络配置文件](advanced_network/config_file.md)
|
||||
* [配置 HTTP/HTTPS 网络代理](advanced_network/http_https_proxy.md)
|
||||
* [实例:创建一个点到点连接](advanced_network/ptp.md)
|
||||
* [Docker Buildx](buildx/README.md)
|
||||
* [BuildKit](buildx/buildkit.md)
|
||||
* [使用 buildx 构建镜像](buildx/buildx.md)
|
||||
* [使用 buildx 构建多种系统架构支持的 Docker 镜像](buildx/multi-arch-images.md)
|
||||
* [README](README.md)
|
||||
* [CHANGELOG](CHANGELOG.md)
|
||||
* [CONTRIBUTING](CONTRIBUTING.md)
|
||||
* [Introduction](introduction/README.md)
|
||||
* [What is Docker](introduction/what.md)
|
||||
* [Why Docker](introduction/why.md)
|
||||
* [Basic concept](basic_concept/README.md)
|
||||
* [Image](basic_concept/image.md)
|
||||
* [Container](basic_concept/container.md)
|
||||
* [Repository](basic_concept/repository.md)
|
||||
* [Get Docker](install/README.md)
|
||||
* [Ubuntu](install/ubuntu.md)
|
||||
* [Debian](install/debian.md)
|
||||
* [Fedora](install/fedora.md)
|
||||
* [CentOS](install/centos.md)
|
||||
* [Raspberry Pi](install/raspberry-pi.md)
|
||||
* [macOS](install/mac.md)
|
||||
* [Windows PC](install/windows.md)
|
||||
* [Mirror](install/mirror.md)
|
||||
* [Image](image/README.md)
|
||||
* [pull](image/pull.md)
|
||||
* [list](image/list.md)
|
||||
* [Delete](image/rm.md)
|
||||
* [commit](image/commit.md)
|
||||
* [Dockerfile](image/build.md)
|
||||
* [Dockerfile reference](image/dockerfile/README.md)
|
||||
* [COPY](image/dockerfile/copy.md)
|
||||
* [ADD](image/dockerfile/add.md)
|
||||
* [CMD](image/dockerfile/cmd.md)
|
||||
* [ENTRYPOINT](image/dockerfile/entrypoint.md)
|
||||
* [ENV](image/dockerfile/env.md)
|
||||
* [ARG](image/dockerfile/arg.md)
|
||||
* [VOLUME](image/dockerfile/volume.md)
|
||||
* [EXPOSE](image/dockerfile/expose.md)
|
||||
* [WORKDIR](image/dockerfile/workdir.md)
|
||||
* [USER](image/dockerfile/user.md)
|
||||
* [HEALTHCHECK](image/dockerfile/healthcheck.md)
|
||||
* [ONBUILD](image/dockerfile/onbuild.md)
|
||||
* [References](image/dockerfile/references.md)
|
||||
* [Multistage builds](image/multistage-builds/README.md)
|
||||
* [Multistage builds Laravel](image/multistage-builds/laravel.md)
|
||||
* [manifest](image/manifest.md)
|
||||
* [BuildKit](image/buildkit.md)
|
||||
* [Other](image/other.md)
|
||||
* [Internal](image/internal.md)
|
||||
* [Container](container/README.md)
|
||||
* [run](container/run.md)
|
||||
* [Daemon](container/daemon.md)
|
||||
* [stop](container/stop.md)
|
||||
* [exec](container/attach_exec.md)
|
||||
* [Import and export](container/import_export.md)
|
||||
* [Delete](container/rm.md)
|
||||
* [Repository](repository/README.md)
|
||||
* [Docker Hub](repository/dockerhub.md)
|
||||
* [Docker Registry](repository/registry.md)
|
||||
* [Docker Registry TLS](repository/registry_auth.md)
|
||||
* [Nexus 3](repository/nexus3_registry.md)
|
||||
* [Data management](data_management/README.md)
|
||||
* [Volumes](data_management/volume.md)
|
||||
* [Bind mounts](data_management/bind-mounts.md)
|
||||
* [Network](network/README.md)
|
||||
* [Port mapping](network/port_mapping.md)
|
||||
* [Linking](network/linking.md)
|
||||
* [DNS](network/dns.md)
|
||||
* [Advanced network](advanced_network/README.md)
|
||||
* [Guide](advanced_network/quick_guide.md)
|
||||
* [Access control](advanced_network/access_control.md)
|
||||
* [Port mapping](advanced_network/port_mapping.md)
|
||||
* [docker0](advanced_network/docker0.md)
|
||||
* [Bridge](advanced_network/bridge.md)
|
||||
* [Example](advanced_network/example.md)
|
||||
* [Config](advanced_network/config_file.md)
|
||||
* [PTP](advanced_network/ptp.md)
|
||||
* [Docker Compose](compose/README.md)
|
||||
* [简介](compose/introduction.md)
|
||||
* [Compose v2](compose/v2.md)
|
||||
* [安装与卸载](compose/install.md)
|
||||
* [使用](compose/usage.md)
|
||||
* [命令说明](compose/commands.md)
|
||||
* [Compose 模板文件](compose/compose_file.md)
|
||||
* [实战 Django](compose/django.md)
|
||||
* [实战 Rails](compose/rails.md)
|
||||
* [实战 WordPress](compose/wordpress.md)
|
||||
* [实战 LNMP](compose/lnmp.md)
|
||||
* [Introduction](compose/introduction.md)
|
||||
* [Install](compose/install.md)
|
||||
* [Usage](compose/usage.md)
|
||||
* [Commands](compose/commands.md)
|
||||
* [Compose file reference](compose/compose_file.md)
|
||||
* [Django](compose/django.md)
|
||||
* [Rails](compose/rails.md)
|
||||
* [WordPress](compose/wordpress.md)
|
||||
* [Docker Swarm](swarm/README.md)
|
||||
* [Swarm mode](swarm_mode/README.md)
|
||||
* [基本概念](swarm_mode/overview.md)
|
||||
* [创建 Swarm 集群](swarm_mode/create.md)
|
||||
* [部署服务](swarm_mode/deploy.md)
|
||||
* [使用 compose 文件](swarm_mode/stack.md)
|
||||
* [管理密钥](swarm_mode/secret.md)
|
||||
* [管理配置信息](swarm_mode/config.md)
|
||||
* [滚动升级](swarm_mode/rolling_update.md)
|
||||
* [安全](security/README.md)
|
||||
* [内核命名空间](security/kernel_ns.md)
|
||||
* [控制组](security/control_group.md)
|
||||
* [服务端防护](security/daemon_sec.md)
|
||||
* [内核能力机制](security/kernel_capability.md)
|
||||
* [其它安全特性](security/other_feature.md)
|
||||
* [总结](security/summary.md)
|
||||
* [底层实现](underly/README.md)
|
||||
* [基本架构](underly/arch.md)
|
||||
* [命名空间](underly/namespace.md)
|
||||
* [控制组](underly/cgroups.md)
|
||||
* [联合文件系统](underly/ufs.md)
|
||||
* [容器格式](underly/container_format.md)
|
||||
* [网络](underly/network.md)
|
||||
* [Etcd 项目](etcd/README.md)
|
||||
* [简介](etcd/intro.md)
|
||||
* [安装](etcd/install.md)
|
||||
* [集群](etcd/cluster.md)
|
||||
* [使用 etcdctl](etcd/etcdctl.md)
|
||||
* [Fedora CoreOS](coreos/README.md)
|
||||
* [简介](coreos/intro.md)
|
||||
* [安装](coreos/install.md)
|
||||
* [Kubernetes - 开源容器编排引擎](kubernetes/README.md)
|
||||
* [简介](kubernetes/intro.md)
|
||||
* [基本概念](kubernetes/concepts.md)
|
||||
* [架构设计](kubernetes/design.md)
|
||||
* [部署 Kubernetes](kubernetes/setup/README.md)
|
||||
* [使用 kubeadm 部署 kubernetes(CRI 使用 containerd)](kubernetes/setup/kubeadm.md)
|
||||
* [在 Docker Desktop 使用](kubernetes/setup/docker-desktop.md)
|
||||
* [一步步部署 kubernetes 集群](kubernetes/setup/systemd.md)
|
||||
* [部署 Dashboard](kubernetes/setup/dashboard.md)
|
||||
* [Kubernetes 命令行 kubectl](kubernetes/kubectl/README.md)
|
||||
* [容器与云计算](cloud/README.md)
|
||||
* [简介](cloud/intro.md)
|
||||
* [腾讯云](cloud/tencentCloud.md)
|
||||
* [阿里云](cloud/alicloud.md)
|
||||
* [亚马逊云](cloud/aws.md)
|
||||
* [小结](cloud/summary.md)
|
||||
* [实战案例 - 操作系统](cases/os/README.md)
|
||||
* [Busybox](cases/os/busybox.md)
|
||||
* [Alpine](cases/os/alpine.md)
|
||||
* [Debian Ubuntu](cases/os/debian.md)
|
||||
* [CentOS Fedora](cases/os/centos.md)
|
||||
* [本章小结](cases/os/summary.md)
|
||||
* [实战案例 - CI/CD](cases/ci/README.md)
|
||||
* [GitHub Actions](cases/ci/actions/README.md)
|
||||
* [Drone](cases/ci/drone/README.md)
|
||||
* [部署 Drone](cases/ci/drone/install.md)
|
||||
* [在 IDE 中使用 Docker](ide/README.md)
|
||||
* [VS Code](ide/vsCode.md)
|
||||
* [podman - 下一代 Linux 容器工具](podman/README.md)
|
||||
* [附录](appendix/README.md)
|
||||
* [附录一:常见问题总结](appendix/faq/README.md)
|
||||
* [附录二:热门镜像介绍](appendix/repo/README.md)
|
||||
* [Ubuntu](appendix/repo/ubuntu.md)
|
||||
* [CentOS](appendix/repo/centos.md)
|
||||
* [Nginx](appendix/repo/nginx.md)
|
||||
* [PHP](appendix/repo/php.md)
|
||||
* [Node.js](appendix/repo/nodejs.md)
|
||||
* [MySQL](appendix/repo/mysql.md)
|
||||
* [WordPress](appendix/repo/wordpress.md)
|
||||
* [MongoDB](appendix/repo/mongodb.md)
|
||||
* [Redis](appendix/repo/redis.md)
|
||||
* [Minio](appendix/repo/minio.md)
|
||||
* [附录三:Docker 命令查询](appendix/command/README.md)
|
||||
* [客户端命令 - docker](appendix/command/docker.md)
|
||||
* [服务端命令 - dockerd](appendix/command/dockerd.md)
|
||||
* [附录四:Dockerfile 最佳实践](appendix/best_practices.md)
|
||||
* [附录五:如何调试 Docker](appendix/debug.md)
|
||||
* [附录六:资源链接](appendix/resources.md)
|
||||
* [Overview](swarm_mode/overview.md)
|
||||
* [Create](swarm_mode/create.md)
|
||||
* [Deploy](swarm_mode/deploy.md)
|
||||
* [Stack](swarm_mode/stack.md)
|
||||
* [Secret](swarm_mode/secret.md)
|
||||
* [Config](swarm_mode/config.md)
|
||||
* [Rolling update](swarm_mode/rolling_update.md)
|
||||
* [Security](security/README.md)
|
||||
* [namespace](security/kernel_ns.md)
|
||||
* [cgroups](security/control_group.md)
|
||||
* [Daemon sec](security/daemon_sec.md)
|
||||
* [Kernel capability](security/kernel_capability.md)
|
||||
* [Other feature](security/other_feature.md)
|
||||
* [SUMMARY](security/summary.md)
|
||||
* [Underly](underly/README.md)
|
||||
* [Arch](underly/arch.md)
|
||||
* [namespace](underly/namespace.md)
|
||||
* [cgroups](underly/cgroups.md)
|
||||
* [ufs](underly/ufs.md)
|
||||
* [Container format](underly/container_format.md)
|
||||
* [Network](underly/network.md)
|
||||
* [Etcd](etcd/README.md)
|
||||
* [Introduction](etcd/intro.md)
|
||||
* [Install](etcd/install.md)
|
||||
* [Cluster](etcd/cluster.md)
|
||||
* [etcdctl](etcd/etcdctl.md)
|
||||
* [CoreOS](coreos/README.md)
|
||||
* [Introduction](coreos/intro.md)
|
||||
* [Tools](coreos/intro_tools.md)
|
||||
* [Kubernetes](kubernetes/README.md)
|
||||
* [Introduction](kubernetes/intro.md)
|
||||
* [Quick start](kubernetes/quickstart.md)
|
||||
* [Concepts](kubernetes/concepts.md)
|
||||
* [kubectl](kubernetes/kubectl.md)
|
||||
* [Design](kubernetes/design.md)
|
||||
* [Cloud](cloud/README.md)
|
||||
* [Introduction](cloud/intro.md)
|
||||
* [AWS](cloud/aws.md)
|
||||
* [Tencent Cloud](cloud/tencentCloud.md)
|
||||
* [Alibaba Cloud](cloud/alicloud.md)
|
||||
* [SUMMARY](cloud/summary.md)
|
||||
* [OS](cases/os/README.md)
|
||||
* [Busybox](cases/os/busybox.md)
|
||||
* [Alpine](cases/os/alpine.md)
|
||||
* [Debian Ubuntu](cases/os/debian.md)
|
||||
* [CentOS Fedora](cases/os/centos.md)
|
||||
* [SUMMARY](cases/os/summary.md)
|
||||
* [CI/CD](cases/ci/README.md)
|
||||
* [GitHub Actions](cases/ci/actions/README.md)
|
||||
* [Drone](cases/ci/drone/README.md)
|
||||
* [Install Drone](cases/ci/drone/install.md)
|
||||
* [Travis CI](cases/ci/travis/README.md)
|
||||
* [Docker Open Source](opensource/README.md)
|
||||
* [LinuxKit](opensource/linuxkit.md)
|
||||
* [Appendix](appendix/README.md)
|
||||
* [FAQ](appendix/faq/README.md)
|
||||
* [Sample Docker Image](appendix/repo/README.md)
|
||||
* [Ubuntu](appendix/repo/ubuntu.md)
|
||||
* [CentOS](appendix/repo/centos.md)
|
||||
* [Nginx](appendix/repo/nginx.md)
|
||||
* [PHP](appendix/repo/php.md)
|
||||
* [MySQL](appendix/repo/mysql.md)
|
||||
* [WordPress](appendix/repo/wordpress.md)
|
||||
* [MongoDB](appendix/repo/mongodb.md)
|
||||
* [Redis](appendix/repo/redis.md)
|
||||
* [Node.js](appendix/repo/nodejs.md)
|
||||
* [Docker commands](appendix/command/README.md)
|
||||
* [Docker debug](appendix/debug.md)
|
||||
* [Resources](appendix/resources.md)
|
||||
|
||||
@@ -6,10 +6,10 @@
|
||||
|
||||
当 Docker 启动时,会自动在主机上创建一个 `docker0` 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。
|
||||
|
||||
同时,Docker 随机分配一个本地未占用的私有网段(在 [RFC1918](https://datatracker.ietf.org/doc/html/rfc1918) 中定义)中的一个地址给 `docker0` 接口。比如典型的 `172.17.42.1`,掩码为 `255.255.0.0`。此后启动的容器内的网口也会自动分配一个同一网段(`172.17.0.0/16`)的地址。
|
||||
同时,Docker 随机分配一个本地未占用的私有网段(在 [RFC1918](https://tools.ietf.org/html/rfc1918) 中定义)中的一个地址给 `docker0` 接口。比如典型的 `172.17.42.1`,掩码为 `255.255.0.0`。此后启动的容器内的网口也会自动分配一个同一网段(`172.17.0.0/16`)的地址。
|
||||
|
||||
当创建一个 Docker 容器的时候,同时会创建了一对 `veth pair` 接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 `eth0`;另一端在本地并被挂载到 `docker0` 网桥,名称以 `veth` 开头(例如 `vethAQI2QT`)。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络。
|
||||
|
||||

|
||||

|
||||
|
||||
接下来的部分将介绍在一些场景中,Docker 所有的网络定制配置。以及通过 Linux 命令来调整、补充、甚至替换 Docker 默认的网络配置。
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
# 容器访问控制
|
||||
|
||||
## 容器访问控制
|
||||
容器的访问控制,主要通过 Linux 上的 `iptables` 防火墙来进行管理和实现。`iptables` 是 Linux 上默认的防火墙软件,在大部分发行版中都自带。
|
||||
|
||||
## 容器访问外部网络
|
||||
### 容器访问外部网络
|
||||
容器要想访问外部网络,需要本地系统的转发支持。在Linux 系统中,检查转发是否打开。
|
||||
|
||||
```bash
|
||||
@@ -15,17 +14,17 @@ $sysctl -w net.ipv4.ip_forward=1
|
||||
```
|
||||
如果在启动 Docker 服务的时候设定 `--ip-forward=true`, Docker 就会自动设定系统的 `ip_forward` 参数为 1。
|
||||
|
||||
## 容器之间访问
|
||||
### 容器之间访问
|
||||
容器之间相互访问,需要两方面的支持。
|
||||
* 容器的网络拓扑是否已经互联。默认情况下,所有容器都会被连接到 `docker0` 网桥上。
|
||||
* 本地系统的防火墙软件 -- `iptables` 是否允许通过。
|
||||
|
||||
### 访问所有端口
|
||||
#### 访问所有端口
|
||||
当启动 Docker 服务(即 dockerd)的时候,默认会添加一条转发策略到本地主机 iptables 的 FORWARD 链上。策略为通过(`ACCEPT`)还是禁止(`DROP`)取决于配置`--icc=true`(缺省值)还是 `--icc=false`。当然,如果手动指定 `--iptables=false` 则不会添加 `iptables` 规则。
|
||||
|
||||
可见,默认情况下,不同容器之间是允许网络互通的。如果为了安全考虑,可以在 `/etc/docker/daemon.json` 文件中配置 `{"icc": false}` 来禁止它。
|
||||
|
||||
### 访问指定端口
|
||||
#### 访问指定端口
|
||||
在通过 `-icc=false` 关闭网络访问后,还可以通过 `--link=CONTAINER_NAME:ALIAS` 选项来访问容器的开放端口。
|
||||
|
||||
例如,在启动 Docker 服务时,可以同时使用 `icc=false --iptables=true` 参数来关闭允许相互的网络访问,并让 Docker 可以修改系统中的 `iptables` 规则。
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# 自定义网桥
|
||||
## 自定义网桥
|
||||
|
||||
除了默认的 `docker0` 网桥,用户也可以指定网桥来连接各个容器。
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# 编辑网络配置文件
|
||||
## 编辑网络配置文件
|
||||
|
||||
Docker 1.2.0 开始支持在运行中的容器里编辑 `/etc/hosts`, `/etc/hostname` 和 `/etc/resolv.conf` 文件。
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# 配置 docker0 网桥
|
||||
## 配置 docker0 网桥
|
||||
|
||||
Docker 服务默认会创建一个 `docker0` 网桥(其上有一个 `docker0` 内部接口),它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。
|
||||
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
# 工具和示例
|
||||
|
||||
## 工具和示例
|
||||
在介绍自定义网络拓扑之前,你可能会对一些外部工具和例子感兴趣:
|
||||
|
||||
## pipework
|
||||
### pipework
|
||||
Jérôme Petazzoni 编写了一个叫 [pipework](https://github.com/jpetazzo/pipework) 的 shell 脚本,可以帮助用户在比较复杂的场景中完成容器的连接。
|
||||
|
||||
## playground
|
||||
Brandon Rhodes 创建了一个提供完整的 Docker 容器网络拓扑管理的 [Python库](https://github.com/brandon-rhodes/fopnp/tree/m/playground),包括路由、NAT 防火墙;以及一些提供 `HTTP` `SMTP` `POP` `IMAP` `Telnet` `SSH` `FTP` 的服务器。
|
||||
### playground
|
||||
Brandon Rhodes 创建了一个提供完整的 Docker 容器网络拓扑管理的 [Python库](https://github.com/brandon-rhodes/fopnp/tree/m/playground),包括路由、NAT 防火墙;以及一些提供 HTTP, SMTP, POP, IMAP, Telnet, SSH, FTP 的服务器。
|
||||
|
||||
@@ -1,74 +0,0 @@
|
||||
# 配置 HTTP/HTTPS 网络代理
|
||||
|
||||
使用Docker的过程中,因为网络原因,通常需要使用 HTTP/HTTPS 代理来加速镜像拉取、构建和使用。下面是常见的三种场景。
|
||||
|
||||
## 为 dockerd 设置网络代理
|
||||
|
||||
"docker pull" 命令是由 dockerd 守护进程执行。而 dockerd 守护进程是由 systemd 管理。因此,如果需要在执行 "docker pull" 命令时使用 HTTP/HTTPS 代理,需要通过 systemd 配置。
|
||||
|
||||
- 为 dockerd 创建配置文件夹。
|
||||
```
|
||||
sudo mkdir -p /etc/systemd/system/docker.service.d
|
||||
```
|
||||
|
||||
- 为 dockerd 创建 HTTP/HTTPS 网络代理的配置文件,文件路径是 /etc/systemd/system/docker.service.d/http-proxy.conf 。并在该文件中添加相关环境变量。
|
||||
```
|
||||
[Service]
|
||||
Environment="HTTP_PROXY=http://proxy.example.com:8080/"
|
||||
Environment="HTTPS_PROXY=http://proxy.example.com:8080/"
|
||||
Environment="NO_PROXY=localhost,127.0.0.1,.example.com"
|
||||
```
|
||||
|
||||
- 刷新配置并重启 docker 服务。
|
||||
```
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl restart docker
|
||||
```
|
||||
|
||||
## 为 docker 容器设置网络代理
|
||||
|
||||
在容器运行阶段,如果需要使用 HTTP/HTTPS 代理,可以通过更改 docker 客户端配置,或者指定环境变量的方式。
|
||||
|
||||
- 更改 docker 客户端配置:创建或更改 ~/.docker/config.json,并在该文件中添加相关配置。
|
||||
```
|
||||
{
|
||||
"proxies":
|
||||
{
|
||||
"default":
|
||||
{
|
||||
"httpProxy": "http://proxy.example.com:8080/",
|
||||
"httpsProxy": "http://proxy.example.com:8080/",
|
||||
"noProxy": "localhost,127.0.0.1,.example.com"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
- 指定环境变量:运行 "docker run" 命令时,指定相关环境变量。
|
||||
|
||||
| 环境变量 | docker run 示例 |
|
||||
| -------- | ---------------- |
|
||||
| HTTP_PROXY | --env HTTP_PROXY="http://proxy.example.com:8080/" |
|
||||
| HTTPS_PROXY | --env HTTPS_PROXY="http://proxy.example.com:8080/" |
|
||||
| NO_PROXY | --env NO_PROXY="localhost,127.0.0.1,.example.com" |
|
||||
|
||||
## 为 docker build 过程设置网络代理
|
||||
|
||||
在容器构建阶段,如果需要使用 HTTP/HTTPS 代理,可以通过指定 "docker build" 的环境变量,或者在 Dockerfile 中指定环境变量的方式。
|
||||
|
||||
- 使用 "--build-arg" 指定 "docker build" 的相关环境变量
|
||||
```
|
||||
docker build \
|
||||
--build-arg "HTTP_PROXY=http://proxy.example.com:8080/" \
|
||||
--build-arg "HTTPS_PROXY=http://proxy.example.com:8080/" \
|
||||
--build-arg "NO_PROXY=localhost,127.0.0.1,.example.com" .
|
||||
```
|
||||
|
||||
- 在 Dockerfile 中指定相关环境变量
|
||||
|
||||
| 环境变量 | Dockerfile 示例 |
|
||||
| -------- | ---------------- |
|
||||
| HTTP_PROXY | ENV HTTP_PROXY="http://proxy.example.com:8080/" |
|
||||
| HTTPS_PROXY | ENV HTTPS_PROXY="http://proxy.example.com:8080/" |
|
||||
| NO_PROXY | ENV NO_PROXY="localhost,127.0.0.1,.example.com" |
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# 映射容器端口到宿主主机的实现
|
||||
## 映射容器端口到宿主主机的实现
|
||||
|
||||
默认情况下,容器可以主动访问到外部网络的连接,但是外部网络无法访问到容器。
|
||||
|
||||
## 容器访问外部实现
|
||||
### 容器访问外部实现
|
||||
|
||||
容器所有到外部网络的连接,源地址都会被 NAT 成本地系统的 IP 地址。这是使用 `iptables` 的源地址伪装操作实现的。
|
||||
|
||||
@@ -19,7 +19,7 @@ MASQUERADE all -- 172.17.0.0/16 !172.17.0.0/16
|
||||
|
||||
其中,上述规则将所有源地址在 `172.17.0.0/16` 网段,目标地址为其他网段(外部网络)的流量动态伪装为从系统网卡发出。MASQUERADE 跟传统 SNAT 的好处是它能动态从网卡获取地址。
|
||||
|
||||
## 外部访问容器实现
|
||||
### 外部访问容器实现
|
||||
|
||||
容器允许外部访问,可以在 `docker run` 时候通过 `-p` 或 `-P` 参数来启用。
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# 示例:创建一个点到点连接
|
||||
## 示例:创建一个点到点连接
|
||||
默认情况下,Docker 会将所有容器连接到由 `docker0` 提供的虚拟子网中。
|
||||
|
||||
用户有时候需要两个容器之间可以直连通信,而不用通过主机网桥进行桥接。
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# 快速配置指南
|
||||
## 快速配置指南
|
||||
|
||||
下面是一个跟 Docker 网络相关的命令列表。
|
||||
|
||||
|
||||
@@ -1,344 +1 @@
|
||||
# Dockerfile 最佳实践
|
||||
|
||||
本附录是笔者对 Docker 官方文档中 [Best practices for writing Dockerfiles](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/) 的理解与翻译。
|
||||
|
||||
## 一般性的指南和建议
|
||||
|
||||
### 容器应该是短暂的
|
||||
|
||||
通过 `Dockerfile` 构建的镜像所启动的容器应该尽可能短暂(生命周期短)。「短暂」意味着可以停止和销毁容器,并且创建一个新容器并部署好所需的设置和配置工作量应该是极小的。
|
||||
|
||||
### 使用 `.dockerignore` 文件
|
||||
|
||||
使用 `Dockerfile` 构建镜像时最好是将 `Dockerfile` 放置在一个新建的空目录下。然后将构建镜像所需要的文件添加到该目录中。为了提高构建镜像的效率,你可以在目录下新建一个 `.dockerignore` 文件来指定要忽略的文件和目录。`.dockerignore` 文件的排除模式语法和 Git 的 `.gitignore` 文件相似。
|
||||
|
||||
### 使用多阶段构建
|
||||
|
||||
在 `Docker 17.05` 以上版本中,你可以使用 [多阶段构建](../image/multistage-builds.md) 来减少所构建镜像的大小。
|
||||
|
||||
### 避免安装不必要的包
|
||||
|
||||
为了降低复杂性、减少依赖、减小文件大小、节约构建时间,你应该避免安装任何不必要的包。例如,不要在数据库镜像中包含一个文本编辑器。
|
||||
|
||||
### 一个容器只运行一个进程
|
||||
|
||||
应该保证在一个容器中只运行一个进程。将多个应用解耦到不同容器中,保证了容器的横向扩展和复用。例如 web 应用应该包含三个容器:web应用、数据库、缓存。
|
||||
|
||||
如果容器互相依赖,你可以使用 [Docker 自定义网络](../network/linking.md) 来把这些容器连接起来。
|
||||
|
||||
### 镜像层数尽可能少
|
||||
|
||||
你需要在 `Dockerfile` 可读性(也包括长期的可维护性)和减少层数之间做一个平衡。
|
||||
|
||||
### 将多行参数排序
|
||||
|
||||
将多行参数按字母顺序排序(比如要安装多个包时)。这可以帮助你避免重复包含同一个包,更新包列表时也更容易。也便于 `PRs` 阅读和审查。建议在反斜杠符号 `\` 之前添加一个空格,以增加可读性。
|
||||
|
||||
下面是来自 `buildpack-deps` 镜像的例子:
|
||||
|
||||
```docker
|
||||
RUN apt-get update && apt-get install -y \
|
||||
bzr \
|
||||
cvs \
|
||||
git \
|
||||
mercurial \
|
||||
subversion
|
||||
```
|
||||
|
||||
### 构建缓存
|
||||
|
||||
在镜像的构建过程中,Docker 会遍历 `Dockerfile` 文件中的指令,然后按顺序执行。在执行每条指令之前,Docker 都会在缓存中查找是否已经存在可重用的镜像,如果有就使用现存的镜像,不再重复创建。如果你不想在构建过程中使用缓存,你可以在 `docker build` 命令中使用 `--no-cache=true` 选项。
|
||||
|
||||
但是,如果你想在构建的过程中使用缓存,你得明白什么时候会,什么时候不会找到匹配的镜像,遵循的基本规则如下:
|
||||
|
||||
* 从一个基础镜像开始(`FROM` 指令指定),下一条指令将和该基础镜像的所有子镜像进行匹配,检查这些子镜像被创建时使用的指令是否和被检查的指令完全一样。如果不是,则缓存失效。
|
||||
* 在大多数情况下,只需要简单地对比 `Dockerfile` 中的指令和子镜像。然而,有些指令需要更多的检查和解释。
|
||||
* 对于 `ADD` 和 `COPY` 指令,镜像中对应文件的内容也会被检查,每个文件都会计算出一个校验和。文件的最后修改时间和最后访问时间不会纳入校验。在缓存的查找过程中,会将这些校验和和已存在镜像中的文件校验和进行对比。如果文件有任何改变,比如内容和元数据,则缓存失效。
|
||||
* 除了 `ADD` 和 `COPY` 指令,缓存匹配过程不会查看临时容器中的文件来决定缓存是否匹配。例如,当执行完 `RUN apt-get -y update` 指令后,容器中一些文件被更新,但 Docker 不会检查这些文件。这种情况下,只有指令字符串本身被用来匹配缓存。
|
||||
|
||||
一旦缓存失效,所有后续的 `Dockerfile` 指令都将产生新的镜像,缓存不会被使用。
|
||||
|
||||
## Dockerfile 指令
|
||||
|
||||
下面针对 `Dockerfile` 中各种指令的最佳编写方式给出建议。
|
||||
|
||||
### FROM
|
||||
|
||||
尽可能使用当前官方仓库作为你构建镜像的基础。推荐使用 [Alpine](https://hub.docker.com/_/alpine/) 镜像,因为它被严格控制并保持最小尺寸(目前小于 5 MB),但它仍然是一个完整的发行版。
|
||||
|
||||
### LABEL
|
||||
|
||||
你可以给镜像添加标签来帮助组织镜像、记录许可信息、辅助自动化构建等。每个标签一行,由 `LABEL` 开头加上一个或多个标签对。下面的示例展示了各种不同的可能格式。`#` 开头的行是注释内容。
|
||||
|
||||
>注意:如果你的字符串中包含空格,必须将字符串放入引号中或者对空格使用转义。如果字符串内容本身就包含引号,必须对引号使用转义。
|
||||
|
||||
```docker
|
||||
# Set one or more individual labels
|
||||
LABEL com.example.version="0.0.1-beta"
|
||||
|
||||
LABEL vendor="ACME Incorporated"
|
||||
|
||||
LABEL com.example.release-date="2015-02-12"
|
||||
|
||||
LABEL com.example.version.is-production=""
|
||||
```
|
||||
|
||||
一个镜像可以包含多个标签,但建议将多个标签放入到一个 `LABEL` 指令中。
|
||||
|
||||
```docker
|
||||
# Set multiple labels at once, using line-continuation characters to break long lines
|
||||
LABEL vendor=ACME\ Incorporated \
|
||||
com.example.is-beta= \
|
||||
com.example.is-production="" \
|
||||
com.example.version="0.0.1-beta" \
|
||||
com.example.release-date="2015-02-12"
|
||||
```
|
||||
|
||||
关于标签可以接受的键值对,参考 [Understanding object labels](https://docs.docker.com/config/labels-custom-metadata/)。关于查询标签信息,参考 [Managing labels on objects](https://docs.docker.com/config/labels-custom-metadata/)。
|
||||
|
||||
### RUN
|
||||
|
||||
为了保持 `Dockerfile` 文件的可读性,可理解性,以及可维护性,建议将长的或复杂的 `RUN` 指令用反斜杠 `\` 分割成多行。
|
||||
|
||||
#### apt-get
|
||||
|
||||
`RUN` 指令最常见的用法是安装包用的 `apt-get`。因为 `RUN apt-get` 指令会安装包,所以有几个问题需要注意。
|
||||
|
||||
不要使用 `RUN apt-get upgrade` 或 `dist-upgrade`,因为许多基础镜像中的「必须」包不会在一个非特权容器中升级。如果基础镜像中的某个包过时了,你应该联系它的维护者。如果你确定某个特定的包,比如 `foo`,需要升级,使用 `apt-get install -y foo` 就行,该指令会自动升级 `foo` 包。
|
||||
|
||||
永远将 `RUN apt-get update` 和 `apt-get install` 组合成一条 `RUN` 声明,例如:
|
||||
|
||||
```docker
|
||||
RUN apt-get update && apt-get install -y \
|
||||
package-bar \
|
||||
package-baz \
|
||||
package-foo
|
||||
```
|
||||
|
||||
将 `apt-get update` 放在一条单独的 `RUN` 声明中会导致缓存问题以及后续的 `apt-get install` 失败。比如,假设你有一个 `Dockerfile` 文件:
|
||||
|
||||
```docker
|
||||
FROM ubuntu:18.04
|
||||
|
||||
RUN apt-get update
|
||||
|
||||
RUN apt-get install -y curl
|
||||
```
|
||||
|
||||
构建镜像后,所有的层都在 Docker 的缓存中。假设你后来又修改了其中的 `apt-get install` 添加了一个包:
|
||||
|
||||
```docker
|
||||
FROM ubuntu:18.04
|
||||
|
||||
RUN apt-get update
|
||||
|
||||
RUN apt-get install -y curl nginx
|
||||
```
|
||||
|
||||
Docker 发现修改后的 `RUN apt-get update` 指令和之前的完全一样。所以,`apt-get update` 不会执行,而是使用之前的缓存镜像。因为 `apt-get update` 没有运行,后面的 `apt-get install` 可能安装的是过时的 `curl` 和 `nginx` 版本。
|
||||
|
||||
使用 `RUN apt-get update && apt-get install -y` 可以确保你的 Dockerfiles 每次安装的都是包的最新的版本,而且这个过程不需要进一步的编码或额外干预。这项技术叫作 `cache busting`。你也可以显示指定一个包的版本号来达到 `cache-busting`,这就是所谓的固定版本,例如:
|
||||
|
||||
```docker
|
||||
RUN apt-get update && apt-get install -y \
|
||||
package-bar \
|
||||
package-baz \
|
||||
package-foo=1.3.*
|
||||
```
|
||||
|
||||
固定版本会迫使构建过程检索特定的版本,而不管缓存中有什么。这项技术也可以减少因所需包中未预料到的变化而导致的失败。
|
||||
|
||||
下面是一个 `RUN` 指令的示例模板,展示了所有关于 `apt-get` 的建议。
|
||||
|
||||
```docker
|
||||
RUN apt-get update && apt-get install -y \
|
||||
aufs-tools \
|
||||
automake \
|
||||
build-essential \
|
||||
curl \
|
||||
dpkg-sig \
|
||||
libcap-dev \
|
||||
libsqlite3-dev \
|
||||
mercurial \
|
||||
reprepro \
|
||||
ruby1.9.1 \
|
||||
ruby1.9.1-dev \
|
||||
s3cmd=1.1.* \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
```
|
||||
|
||||
其中 `s3cmd` 指令指定了一个版本号 `1.1.*`。如果之前的镜像使用的是更旧的版本,指定新的版本会导致 `apt-get update` 缓存失效并确保安装的是新版本。
|
||||
|
||||
另外,清理掉 apt 缓存 `var/lib/apt/lists` 可以减小镜像大小。因为 `RUN` 指令的开头为 `apt-get update`,包缓存总是会在 `apt-get install` 之前刷新。
|
||||
|
||||
> 注意:官方的 Debian 和 Ubuntu 镜像会自动运行 apt-get clean,所以不需要显式的调用 apt-get clean。
|
||||
|
||||
### CMD
|
||||
|
||||
`CMD` 指令用于执行目标镜像中包含的软件,可以包含参数。`CMD` 大多数情况下都应该以 `CMD ["executable", "param1", "param2"...]` 的形式使用。因此,如果创建镜像的目的是为了部署某个服务(比如 `Apache`),你可能会执行类似于 `CMD ["apache2", "-DFOREGROUND"]` 形式的命令。我们建议任何服务镜像都使用这种形式的命令。
|
||||
|
||||
多数情况下,`CMD` 都需要一个交互式的 `shell` (bash, Python, perl 等),例如 `CMD ["perl", "-de0"]`,或者 `CMD ["PHP", "-a"]`。使用这种形式意味着,当你执行类似 `docker run -it python` 时,你会进入一个准备好的 `shell` 中。`CMD` 应该在极少的情况下才能以 `CMD ["param", "param"]` 的形式与 `ENTRYPOINT` 协同使用,除非你和你的镜像使用者都对 `ENTRYPOINT` 的工作方式十分熟悉。
|
||||
|
||||
### EXPOSE
|
||||
|
||||
`EXPOSE` 指令用于指定容器将要监听的端口。因此,你应该为你的应用程序使用常见的端口。例如,提供 `Apache` web 服务的镜像应该使用 `EXPOSE 80`,而提供 `MongoDB` 服务的镜像使用 `EXPOSE 27017`。
|
||||
|
||||
对于外部访问,用户可以在执行 `docker run` 时使用一个标志来指示如何将指定的端口映射到所选择的端口。
|
||||
|
||||
### ENV
|
||||
|
||||
为了方便新程序运行,你可以使用 `ENV` 来为容器中安装的程序更新 `PATH` 环境变量。例如使用 `ENV PATH /usr/local/nginx/bin:$PATH` 来确保 `CMD ["nginx"]` 能正确运行。
|
||||
|
||||
`ENV` 指令也可用于为你想要容器化的服务提供必要的环境变量,比如 Postgres 需要的 `PGDATA`。
|
||||
|
||||
最后,`ENV` 也能用于设置常见的版本号,比如下面的示例:
|
||||
|
||||
```docker
|
||||
ENV PG_MAJOR 9.3
|
||||
|
||||
ENV PG_VERSION 9.3.4
|
||||
|
||||
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && …
|
||||
|
||||
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH
|
||||
```
|
||||
|
||||
类似于程序中的常量,这种方法可以让你只需改变 `ENV` 指令来自动的改变容器中的软件版本。
|
||||
|
||||
### ADD 和 COPY
|
||||
|
||||
虽然 `ADD` 和 `COPY` 功能类似,但一般优先使用 `COPY`。因为它比 `ADD` 更透明。`COPY` 只支持简单将本地文件拷贝到容器中,而 `ADD` 有一些并不明显的功能(比如本地 tar 提取和远程 URL 支持)。因此,`ADD` 的最佳用例是将本地 tar 文件自动提取到镜像中,例如 `ADD rootfs.tar.xz`。
|
||||
|
||||
如果你的 `Dockerfile` 有多个步骤需要使用上下文中不同的文件。单独 `COPY` 每个文件,而不是一次性的 `COPY` 所有文件,这将保证每个步骤的构建缓存只在特定的文件变化时失效。例如:
|
||||
|
||||
```docker
|
||||
COPY requirements.txt /tmp/
|
||||
|
||||
RUN pip install --requirement /tmp/requirements.txt
|
||||
|
||||
COPY . /tmp/
|
||||
```
|
||||
|
||||
如果将 `COPY . /tmp/` 放置在 `RUN` 指令之前,只要 `.` 目录中任何一个文件变化,都会导致后续指令的缓存失效。
|
||||
|
||||
为了让镜像尽量小,最好不要使用 `ADD` 指令从远程 URL 获取包,而是使用 `curl` 和 `wget`。这样你可以在文件提取完之后删掉不再需要的文件来避免在镜像中额外添加一层。比如尽量避免下面的用法:
|
||||
|
||||
```docker
|
||||
ADD http://example.com/big.tar.xz /usr/src/things/
|
||||
|
||||
RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things
|
||||
|
||||
RUN make -C /usr/src/things all
|
||||
```
|
||||
|
||||
而是应该使用下面这种方法:
|
||||
|
||||
```docker
|
||||
RUN mkdir -p /usr/src/things \
|
||||
&& curl -SL http://example.com/big.tar.xz \
|
||||
| tar -xJC /usr/src/things \
|
||||
&& make -C /usr/src/things all
|
||||
```
|
||||
|
||||
上面使用的管道操作,所以没有中间文件需要删除。
|
||||
|
||||
对于其他不需要 `ADD` 的自动提取功能的文件或目录,你应该使用 `COPY`。
|
||||
|
||||
### ENTRYPOINT
|
||||
|
||||
`ENTRYPOINT` 的最佳用处是设置镜像的主命令,允许将镜像当成命令本身来运行(用 `CMD` 提供默认选项)。
|
||||
|
||||
例如,下面的示例镜像提供了命令行工具 `s3cmd`:
|
||||
|
||||
```docker
|
||||
ENTRYPOINT ["s3cmd"]
|
||||
|
||||
CMD ["--help"]
|
||||
```
|
||||
|
||||
现在直接运行该镜像创建的容器会显示命令帮助:
|
||||
|
||||
```bash
|
||||
$ docker run s3cmd
|
||||
```
|
||||
|
||||
或者提供正确的参数来执行某个命令:
|
||||
|
||||
```bash
|
||||
$ docker run s3cmd ls s3://mybucket
|
||||
```
|
||||
|
||||
这样镜像名可以当成命令行的参考。
|
||||
|
||||
`ENTRYPOINT` 指令也可以结合一个辅助脚本使用,和前面命令行风格类似,即使启动工具需要不止一个步骤。
|
||||
|
||||
例如,`Postgres` 官方镜像使用下面的脚本作为 `ENTRYPOINT`:
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
if [ "$1" = 'postgres' ]; then
|
||||
chown -R postgres "$PGDATA"
|
||||
|
||||
if [ -z "$(ls -A "$PGDATA")" ]; then
|
||||
gosu postgres initdb
|
||||
fi
|
||||
|
||||
exec gosu postgres "$@"
|
||||
fi
|
||||
|
||||
exec "$@"
|
||||
```
|
||||
|
||||
>注意:该脚本使用了 Bash 的内置命令 exec,所以最后运行的进程就是容器的 PID 为 1 的进程。这样,进程就可以接收到任何发送给容器的 Unix 信号了。
|
||||
|
||||
该辅助脚本被拷贝到容器,并在容器启动时通过 `ENTRYPOINT` 执行:
|
||||
|
||||
```docker
|
||||
COPY ./docker-entrypoint.sh /
|
||||
|
||||
ENTRYPOINT ["/docker-entrypoint.sh"]
|
||||
```
|
||||
|
||||
该脚本可以让用户用几种不同的方式和 `Postgres` 交互。
|
||||
|
||||
你可以很简单地启动 `Postgres`:
|
||||
|
||||
```bash
|
||||
$ docker run postgres
|
||||
```
|
||||
|
||||
也可以执行 `Postgres` 并传递参数:
|
||||
|
||||
```bash
|
||||
$ docker run postgres postgres --help
|
||||
```
|
||||
|
||||
最后,你还可以启动另外一个完全不同的工具,比如 `Bash`:
|
||||
|
||||
```bash
|
||||
$ docker run --rm -it postgres bash
|
||||
```
|
||||
|
||||
### VOLUME
|
||||
|
||||
`VOLUME` 指令用于暴露任何数据库存储文件,配置文件,或容器创建的文件和目录。强烈建议使用 `VOLUME` 来管理镜像中的可变部分和用户可以改变的部分。
|
||||
|
||||
### USER
|
||||
|
||||
如果某个服务不需要特权执行,建议使用 `USER` 指令切换到非 root 用户。先在 `Dockerfile` 中使用类似 `RUN groupadd -r postgres && useradd -r -g postgres postgres` 的指令创建用户和用户组。
|
||||
|
||||
>注意:在镜像中,用户和用户组每次被分配的 UID/GID 都是不确定的,下次重新构建镜像时被分配到的 UID/GID 可能会不一样。如果要依赖确定的 UID/GID,你应该显式的指定一个 UID/GID。
|
||||
|
||||
你应该避免使用 `sudo`,因为它不可预期的 TTY 和信号转发行为可能造成的问题比它能解决的问题还多。如果你真的需要和 `sudo` 类似的功能(例如,以 root 权限初始化某个守护进程,以非 root 权限执行它),你可以使用 [gosu](https://github.com/tianon/gosu)。
|
||||
|
||||
最后,为了减少层数和复杂度,避免频繁地使用 `USER` 来回切换用户。
|
||||
|
||||
### WORKDIR
|
||||
|
||||
为了清晰性和可靠性,你应该总是在 `WORKDIR` 中使用绝对路径。另外,你应该使用 `WORKDIR` 来替代类似于 `RUN cd ... && do-something` 的指令,后者难以阅读、排错和维护。
|
||||
|
||||
## 官方镜像示例
|
||||
|
||||
这些官方镜像的 Dockerfile 都是参考典范:https://github.com/docker-library/docs
|
||||
# [Best practices for writing Dockerfiles](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/)
|
||||
|
||||
@@ -10,4 +10,120 @@ Docker 命令有两大类,客户端命令和服务端命令。前者是主要
|
||||
|
||||
可以通过 `man docker` 或 `docker help` 来查看这些命令。
|
||||
|
||||
接下来的小节对这两个命令进行介绍。
|
||||
## 客户端命令选项
|
||||
|
||||
* `--config=""`:指定客户端配置文件,默认为 `~/.docker`;
|
||||
* `-D=true|false`:是否使用 debug 模式。默认不开启;
|
||||
* `-H, --host=[]`:指定命令对应 Docker 守护进程的监听接口,可以为 unix 套接字 `unix:///path/to/socket`,文件句柄 `fd://socketfd` 或 tcp 套接字 `tcp://[host[:port]]`,默认为 `unix:///var/run/docker.sock`;
|
||||
* `-l, --log-level="debug|info|warn|error|fatal"`:指定日志输出级别;
|
||||
* `--tls=true|false`:是否对 Docker 守护进程启用 TLS 安全机制,默认为否;
|
||||
* `--tlscacert=/.docker/ca.pem`:TLS CA 签名的可信证书文件路径;
|
||||
* `--tlscert=/.docker/cert.pem`:TLS 可信证书文件路径;
|
||||
* `--tlscert=/.docker/key.pem`:TLS 密钥文件路径;
|
||||
* `--tlsverify=true|false`:启用 TLS 校验,默认为否。
|
||||
|
||||
## dockerd 命令选项
|
||||
|
||||
* `--api-cors-header=""`:CORS 头部域,默认不允许 CORS,要允许任意的跨域访问,可以指定为 "*";
|
||||
* `--authorization-plugin=""`:载入认证的插件;
|
||||
* `-b=""`:将容器挂载到一个已存在的网桥上。指定为 `none` 时则禁用容器的网络,与 `--bip` 选项互斥;
|
||||
* `--bip=""`:让动态创建的 `docker0` 网桥采用给定的 CIDR 地址; 与 `-b` 选项互斥;
|
||||
* `--cgroup-parent=""`:指定 cgroup 的父组,默认 fs cgroup 驱动为 `/docker`,systemd cgroup 驱动为 `system.slice`;
|
||||
* `--cluster-store=""`:构成集群(如 `Swarm`)时,集群键值数据库服务地址;
|
||||
* `--cluster-advertise=""`:构成集群时,自身的被访问地址,可以为 `host:port` 或 `interface:port`;
|
||||
* `--cluster-store-opt=""`:构成集群时,键值数据库的配置选项;
|
||||
* `--config-file="/etc/docker/daemon.json"`:daemon 配置文件路径;
|
||||
* `--containerd=""`:containerd 文件的路径;
|
||||
* `-D, --debug=true|false`:是否使用 Debug 模式。缺省为 false;
|
||||
* `--default-gateway=""`:容器的 IPv4 网关地址,必须在网桥的子网段内;
|
||||
* `--default-gateway-v6=""`:容器的 IPv6 网关地址;
|
||||
* `--default-ulimit=[]`:默认的 ulimit 值;
|
||||
* `--disable-legacy-registry=true|false`:是否允许访问旧版本的镜像仓库服务器;
|
||||
* `--dns=""`:指定容器使用的 DNS 服务器地址;
|
||||
* `--dns-opt=""`:DNS 选项;
|
||||
* `--dns-search=[]`:DNS 搜索域;
|
||||
* `--exec-opt=[]`:运行时的执行选项;
|
||||
* `--exec-root=""`:容器执行状态文件的根路径,默认为 `/var/run/docker`;
|
||||
* `--fixed-cidr=""`:限定分配 IPv4 地址范围;
|
||||
* `--fixed-cidr-v6=""`:限定分配 IPv6 地址范围;
|
||||
* `-G, --group=""`:分配给 unix 套接字的组,默认为 `docker`;
|
||||
* `-g, --graph=""`:Docker 运行时的根路径,默认为 `/var/lib/docker`;
|
||||
* `-H, --host=[]`:指定命令对应 Docker daemon 的监听接口,可以为 unix 套接字 `unix:///path/to/socket`,文件句柄 `fd://socketfd` 或 tcp 套接字 `tcp://[host[:port]]`,默认为 `unix:///var/run/docker.sock`;
|
||||
* `--icc=true|false`:是否启用容器间以及跟 daemon 所在主机的通信。默认为 true。
|
||||
* `--insecure-registry=[]`:允许访问给定的非安全仓库服务;
|
||||
* `--ip=""`:绑定容器端口时候的默认 IP 地址。缺省为 `0.0.0.0`;
|
||||
* `--ip-forward=true|false`:是否检查启动在 Docker 主机上的启用 IP 转发服务,默认开启。注意关闭该选项将不对系统转发能力进行任何检查修改;
|
||||
* `--ip-masq=true|false`:是否进行地址伪装,用于容器访问外部网络,默认开启;
|
||||
* `--iptables=true|false`:是否允许 Docker 添加 iptables 规则。缺省为 true;
|
||||
* `--ipv6=true|false`:是否启用 IPv6 支持,默认关闭;
|
||||
* `-l, --log-level="debug|info|warn|error|fatal"`:指定日志输出级别;
|
||||
* `--label="[]"`:添加指定的键值对标注;
|
||||
* `--log-driver="json-file|syslog|journald|gelf|fluentd|awslogs|splunk|etwlogs|gcplogs|none"`:指定日志后端驱动,默认为 `json-file`;
|
||||
* `--log-opt=[]`:日志后端的选项;
|
||||
* `--mtu=VALUE`:指定容器网络的 `mtu`;
|
||||
* `-p=""`:指定 daemon 的 PID 文件路径。缺省为 `/var/run/docker.pid`;
|
||||
* `--raw-logs`:输出原始,未加色彩的日志信息;
|
||||
* `--registry-mirror=<scheme>://<host>`:指定 `docker pull` 时使用的注册服务器镜像地址;
|
||||
* `-s, --storage-driver=""`:指定使用给定的存储后端;
|
||||
* `--selinux-enabled=true|false`:是否启用 SELinux 支持。缺省值为 false。SELinux 目前尚不支持 overlay 存储驱动;
|
||||
* `--storage-opt=[]`:驱动后端选项;
|
||||
* `--tls=true|false`:是否对 Docker daemon 启用 TLS 安全机制,默认为否;
|
||||
* `--tlscacert=/.docker/ca.pem`:TLS CA 签名的可信证书文件路径;
|
||||
* `--tlscert=/.docker/cert.pem`:TLS 可信证书文件路径;
|
||||
* `--tlscert=/.docker/key.pem`:TLS 密钥文件路径;
|
||||
* `--tlsverify=true|false`:启用 TLS 校验,默认为否;
|
||||
* `--userland-proxy=true|false`:是否使用用户态代理来实现容器间和出容器的回环通信,默认为 true;
|
||||
* `--userns-remap=default|uid:gid|user:group|user|uid`:指定容器的用户命名空间,默认是创建新的 UID 和 GID 映射到容器内进程。
|
||||
|
||||
## 客户端命令
|
||||
|
||||
可以通过 `docker COMMAND --help` 来查看这些命令的具体用法。
|
||||
|
||||
* `attach`:依附到一个正在运行的容器中;
|
||||
* `build`:从一个 Dockerfile 创建一个镜像;
|
||||
* `commit`:从一个容器的修改中创建一个新的镜像;
|
||||
* `cp`:在容器和本地宿主系统之间复制文件中;
|
||||
* `create`:创建一个新容器,但并不运行它;
|
||||
* `diff`:检查一个容器内文件系统的修改,包括修改和增加;
|
||||
* `events`:从服务端获取实时的事件;
|
||||
* `exec`:在运行的容器内执行命令;
|
||||
* `export`:导出容器内容为一个 `tar` 包;
|
||||
* `history`:显示一个镜像的历史信息;
|
||||
* `images`:列出存在的镜像;
|
||||
* `import`:导入一个文件(典型为 `tar` 包)路径或目录来创建一个本地镜像;
|
||||
* `info`:显示一些相关的系统信息;
|
||||
* `inspect`:显示一个容器的具体配置信息;
|
||||
* `kill`:关闭一个运行中的容器 (包括进程和所有相关资源);
|
||||
* `load`:从一个 tar 包中加载一个镜像;
|
||||
* `login`:注册或登录到一个 Docker 的仓库服务器;
|
||||
* `logout`:从 Docker 的仓库服务器登出;
|
||||
* `logs`:获取容器的 log 信息;
|
||||
* `network`:管理 Docker 的网络,包括查看、创建、删除、挂载、卸载等;
|
||||
* `node`:管理 swarm 集群中的节点,包括查看、更新、删除、提升/取消管理节点等;
|
||||
* `pause`:暂停一个容器中的所有进程;
|
||||
* `port`:查找一个 nat 到一个私有网口的公共口;
|
||||
* `ps`:列出主机上的容器;
|
||||
* `pull`:从一个Docker的仓库服务器下拉一个镜像或仓库;
|
||||
* `push`:将一个镜像或者仓库推送到一个 Docker 的注册服务器;
|
||||
* `rename`:重命名一个容器;
|
||||
* `restart`:重启一个运行中的容器;
|
||||
* `rm`:删除给定的若干个容器;
|
||||
* `rmi`:删除给定的若干个镜像;
|
||||
* `run`:创建一个新容器,并在其中运行给定命令;
|
||||
* `save`:保存一个镜像为 tar 包文件;
|
||||
* `search`:在 Docker index 中搜索一个镜像;
|
||||
* `service`:管理 Docker 所启动的应用服务,包括创建、更新、删除等;
|
||||
* `start`:启动一个容器;
|
||||
* `stats`:输出(一个或多个)容器的资源使用统计信息;
|
||||
* `stop`:终止一个运行中的容器;
|
||||
* `swarm`:管理 Docker swarm 集群,包括创建、加入、退出、更新等;
|
||||
* `tag`:为一个镜像打标签;
|
||||
* `top`:查看一个容器中的正在运行的进程信息;
|
||||
* `unpause`:将一个容器内所有的进程从暂停状态中恢复;
|
||||
* `update`:更新指定的若干容器的配置信息;
|
||||
* `version`:输出 Docker 的版本信息;
|
||||
* `volume`:管理 Docker volume,包括查看、创建、删除等;
|
||||
* `wait`:阻塞直到一个容器终止,然后输出它的退出符。
|
||||
|
||||
## 一张图总结 Docker 的命令
|
||||

|
||||
|
||||
@@ -1,70 +0,0 @@
|
||||
# 客户端命令(docker)
|
||||
|
||||
## 客户端命令选项
|
||||
|
||||
* `--config=""`:指定客户端配置文件,默认为 `~/.docker`;
|
||||
* `-D=true|false`:是否使用 debug 模式。默认不开启;
|
||||
* `-H, --host=[]`:指定命令对应 Docker 守护进程的监听接口,可以为 unix 套接字 `unix:///path/to/socket`,文件句柄 `fd://socketfd` 或 tcp 套接字 `tcp://[host[:port]]`,默认为 `unix:///var/run/docker.sock`;
|
||||
* `-l, --log-level="debug|info|warn|error|fatal"`:指定日志输出级别;
|
||||
* `--tls=true|false`:是否对 Docker 守护进程启用 TLS 安全机制,默认为否;
|
||||
* `--tlscacert=/.docker/ca.pem`:TLS CA 签名的可信证书文件路径;
|
||||
* `--tlscert=/.docker/cert.pem`:TLS 可信证书文件路径;
|
||||
* `--tlscert=/.docker/key.pem`:TLS 密钥文件路径;
|
||||
* `--tlsverify=true|false`:启用 TLS 校验,默认为否。
|
||||
|
||||
## 客户端命令
|
||||
|
||||
可以通过 `docker COMMAND --help` 来查看这些命令的具体用法。
|
||||
|
||||
* `attach`:依附到一个正在运行的容器中;
|
||||
* `build`:从一个 Dockerfile 创建一个镜像;
|
||||
* `commit`:从一个容器的修改中创建一个新的镜像;
|
||||
* `cp`:在容器和本地宿主系统之间复制文件中;
|
||||
* `create`:创建一个新容器,但并不运行它;
|
||||
* `diff`:检查一个容器内文件系统的修改,包括修改和增加;
|
||||
* `events`:从服务端获取实时的事件;
|
||||
* `exec`:在运行的容器内执行命令;
|
||||
* `export`:导出容器内容为一个 `tar` 包;
|
||||
* `history`:显示一个镜像的历史信息;
|
||||
* `images`:列出存在的镜像;
|
||||
* `import`:导入一个文件(典型为 `tar` 包)路径或目录来创建一个本地镜像;
|
||||
* `info`:显示一些相关的系统信息;
|
||||
* `inspect`:显示一个容器的具体配置信息;
|
||||
* `kill`:关闭一个运行中的容器 (包括进程和所有相关资源);
|
||||
* `load`:从一个 tar 包中加载一个镜像;
|
||||
* `login`:注册或登录到一个 Docker 的仓库服务器;
|
||||
* `logout`:从 Docker 的仓库服务器登出;
|
||||
* `logs`:获取容器的 log 信息;
|
||||
* `network`:管理 Docker 的网络,包括查看、创建、删除、挂载、卸载等;
|
||||
* `node`:管理 swarm 集群中的节点,包括查看、更新、删除、提升/取消管理节点等;
|
||||
* `pause`:暂停一个容器中的所有进程;
|
||||
* `port`:查找一个 nat 到一个私有网口的公共口;
|
||||
* `ps`:列出主机上的容器;
|
||||
* `pull`:从一个Docker的仓库服务器下拉一个镜像或仓库;
|
||||
* `push`:将一个镜像或者仓库推送到一个 Docker 的注册服务器;
|
||||
* `rename`:重命名一个容器;
|
||||
* `restart`:重启一个运行中的容器;
|
||||
* `rm`:删除给定的若干个容器;
|
||||
* `rmi`:删除给定的若干个镜像;
|
||||
* `run`:创建一个新容器,并在其中运行给定命令;
|
||||
* `save`:保存一个镜像为 tar 包文件;
|
||||
* `search`:在 Docker index 中搜索一个镜像;
|
||||
* `service`:管理 Docker 所启动的应用服务,包括创建、更新、删除等;
|
||||
* `start`:启动一个容器;
|
||||
* `stats`:输出(一个或多个)容器的资源使用统计信息;
|
||||
* `stop`:终止一个运行中的容器;
|
||||
* `swarm`:管理 Docker swarm 集群,包括创建、加入、退出、更新等;
|
||||
* `tag`:为一个镜像打标签;
|
||||
* `top`:查看一个容器中的正在运行的进程信息;
|
||||
* `unpause`:将一个容器内所有的进程从暂停状态中恢复;
|
||||
* `update`:更新指定的若干容器的配置信息;
|
||||
* `version`:输出 Docker 的版本信息;
|
||||
* `volume`:管理 Docker volume,包括查看、创建、删除等;
|
||||
* `wait`:阻塞直到一个容器终止,然后输出它的退出符。
|
||||
|
||||
## 一张图总结 Docker 的命令
|
||||

|
||||
|
||||
## 参考
|
||||
|
||||
* [官方文档](https://docs.docker.com/engine/reference/commandline/cli/)
|
||||
@@ -1,58 +0,0 @@
|
||||
# 服务端命令(dockerd)
|
||||
|
||||
## dockerd 命令选项
|
||||
|
||||
* `--api-cors-header=""`:CORS 头部域,默认不允许 CORS,要允许任意的跨域访问,可以指定为 "*";
|
||||
* `--authorization-plugin=""`:载入认证的插件;
|
||||
* `-b=""`:将容器挂载到一个已存在的网桥上。指定为 `none` 时则禁用容器的网络,与 `--bip` 选项互斥;
|
||||
* `--bip=""`:让动态创建的 `docker0` 网桥采用给定的 CIDR 地址; 与 `-b` 选项互斥;
|
||||
* `--cgroup-parent=""`:指定 cgroup 的父组,默认 fs cgroup 驱动为 `/docker`,systemd cgroup 驱动为 `system.slice`;
|
||||
* `--cluster-store=""`:构成集群(如 `Swarm`)时,集群键值数据库服务地址;
|
||||
* `--cluster-advertise=""`:构成集群时,自身的被访问地址,可以为 `host:port` 或 `interface:port`;
|
||||
* `--cluster-store-opt=""`:构成集群时,键值数据库的配置选项;
|
||||
* `--config-file="/etc/docker/daemon.json"`:daemon 配置文件路径;
|
||||
* `--containerd=""`:containerd 文件的路径;
|
||||
* `-D, --debug=true|false`:是否使用 Debug 模式。缺省为 false;
|
||||
* `--default-gateway=""`:容器的 IPv4 网关地址,必须在网桥的子网段内;
|
||||
* `--default-gateway-v6=""`:容器的 IPv6 网关地址;
|
||||
* `--default-ulimit=[]`:默认的 ulimit 值;
|
||||
* `--disable-legacy-registry=true|false`:是否允许访问旧版本的镜像仓库服务器;
|
||||
* `--dns=""`:指定容器使用的 DNS 服务器地址;
|
||||
* `--dns-opt=""`:DNS 选项;
|
||||
* `--dns-search=[]`:DNS 搜索域;
|
||||
* `--exec-opt=[]`:运行时的执行选项;
|
||||
* `--exec-root=""`:容器执行状态文件的根路径,默认为 `/var/run/docker`;
|
||||
* `--fixed-cidr=""`:限定分配 IPv4 地址范围;
|
||||
* `--fixed-cidr-v6=""`:限定分配 IPv6 地址范围;
|
||||
* `-G, --group=""`:分配给 unix 套接字的组,默认为 `docker`;
|
||||
* `-g, --graph=""`:Docker 运行时的根路径,默认为 `/var/lib/docker`;
|
||||
* `-H, --host=[]`:指定命令对应 Docker daemon 的监听接口,可以为 unix 套接字 `unix:///path/to/socket`,文件句柄 `fd://socketfd` 或 tcp 套接字 `tcp://[host[:port]]`,默认为 `unix:///var/run/docker.sock`;
|
||||
* `--icc=true|false`:是否启用容器间以及跟 daemon 所在主机的通信。默认为 true。
|
||||
* `--insecure-registry=[]`:允许访问给定的非安全仓库服务;
|
||||
* `--ip=""`:绑定容器端口时候的默认 IP 地址。缺省为 `0.0.0.0`;
|
||||
* `--ip-forward=true|false`:是否检查启动在 Docker 主机上的启用 IP 转发服务,默认开启。注意关闭该选项将不对系统转发能力进行任何检查修改;
|
||||
* `--ip-masq=true|false`:是否进行地址伪装,用于容器访问外部网络,默认开启;
|
||||
* `--iptables=true|false`:是否允许 Docker 添加 iptables 规则。缺省为 true;
|
||||
* `--ipv6=true|false`:是否启用 IPv6 支持,默认关闭;
|
||||
* `-l, --log-level="debug|info|warn|error|fatal"`:指定日志输出级别;
|
||||
* `--label="[]"`:添加指定的键值对标注;
|
||||
* `--log-driver="json-file|syslog|journald|gelf|fluentd|awslogs|splunk|etwlogs|gcplogs|none"`:指定日志后端驱动,默认为 `json-file`;
|
||||
* `--log-opt=[]`:日志后端的选项;
|
||||
* `--mtu=VALUE`:指定容器网络的 `mtu`;
|
||||
* `-p=""`:指定 daemon 的 PID 文件路径。缺省为 `/var/run/docker.pid`;
|
||||
* `--raw-logs`:输出原始,未加色彩的日志信息;
|
||||
* `--registry-mirror=<scheme>://<host>`:指定 `docker pull` 时使用的注册服务器镜像地址;
|
||||
* `-s, --storage-driver=""`:指定使用给定的存储后端;
|
||||
* `--selinux-enabled=true|false`:是否启用 SELinux 支持。缺省值为 false。SELinux 目前尚不支持 overlay 存储驱动;
|
||||
* `--storage-opt=[]`:驱动后端选项;
|
||||
* `--tls=true|false`:是否对 Docker daemon 启用 TLS 安全机制,默认为否;
|
||||
* `--tlscacert=/.docker/ca.pem`:TLS CA 签名的可信证书文件路径;
|
||||
* `--tlscert=/.docker/cert.pem`:TLS 可信证书文件路径;
|
||||
* `--tlscert=/.docker/key.pem`:TLS 密钥文件路径;
|
||||
* `--tlsverify=true|false`:启用 TLS 校验,默认为否;
|
||||
* `--userland-proxy=true|false`:是否使用用户态代理来实现容器间和出容器的回环通信,默认为 true;
|
||||
* `--userns-remap=default|uid:gid|user:group|user|uid`:指定容器的用户命名空间,默认是创建新的 UID 和 GID 映射到容器内进程。
|
||||
|
||||
## 参考
|
||||
|
||||
* [官方文档](https://docs.docker.com/engine/reference/commandline/dockerd/)
|
||||
@@ -21,8 +21,8 @@ $ sudo kill -SIGHUP $(pidof dockerd)
|
||||
## 检查内核日志
|
||||
|
||||
```bash
|
||||
$ sudo dmesg |grep dockerd
|
||||
$ sudo dmesg |grep runc
|
||||
$ sudo dmesag |grep dockerd
|
||||
$ sudo dmesag |grep runc
|
||||
```
|
||||
|
||||
## Docker 不响应时处理
|
||||
|
||||
@@ -12,13 +12,13 @@
|
||||
|
||||
### 本地的镜像文件都存放在哪里?
|
||||
|
||||
答:与 Docker 相关的本地资源默认存放在 `/var/lib/docker/` 目录下,以 `overlay2` 文件系统为例,其中 `containers` 目录存放容器信息,`image` 目录存放镜像信息,`overlay2` 目录下存放具体的镜像层文件。
|
||||
答:与 Docker 相关的本地资源默认存放在 `/var/lib/docker/` 目录下,以 `aufs` 文件系统为例,其中 `container` 目录存放容器信息,`graph` 目录存放镜像信息,`aufs` 目录下存放具体的镜像层文件。
|
||||
|
||||
### 构建 Docker 镜像应该遵循哪些原则?
|
||||
|
||||
答:整体原则上,尽量保持镜像功能的明确和内容的精简,要点包括
|
||||
|
||||
* 尽量选取满足需求但较小的基础系统镜像,例如大部分时候可以选择 `alpine` 镜像,仅有不足六兆大小;
|
||||
* 尽量选取满足需求但较小的基础系统镜像,例如大部分时候可以选择 debian:wheezy 或 debian:stretch 镜像,仅有不足百兆大小;
|
||||
|
||||
* 清理编译生成文件、安装包的缓存等临时文件;
|
||||
|
||||
@@ -52,18 +52,11 @@
|
||||
|
||||
### 如何获取某个容器的 PID 信息?
|
||||
|
||||
答:可以使用
|
||||
|
||||
```bash
|
||||
docker inspect --format '{{ .State.Pid }}' <CONTAINER ID or NAME>
|
||||
```
|
||||
答:可以使用 `docker inspect --format '{{ .State.Pid }}' <CONTAINER ID or NAME>` 命令。
|
||||
|
||||
### 如何获取某个容器的 IP 地址?
|
||||
|
||||
答:可以使用
|
||||
```bash
|
||||
docker inspect --format '{{ .NetworkSettings.IPAddress }}' <CONTAINER ID or NAME>
|
||||
```
|
||||
答:可以使用 `docker inspect --format '{{ .NetworkSettings.IPAddress }}' <CONTAINER ID or NAME>` 命令
|
||||
|
||||
### 如何给容器指定一个固定 IP 地址,而不是每次重启容器 IP 地址都会变?
|
||||
|
||||
@@ -149,7 +142,7 @@ lrwxrwxrwx. 1 root root 15 11月 17 13:43 docker -> /storage/docker
|
||||
|
||||
答:LXC 利用 Linux 上相关技术实现了容器。Docker 则在如下的几个方面进行了改进:
|
||||
* 移植性:通过抽象容器配置,容器可以实现从一个平台移植到另一个平台;
|
||||
* 镜像系统:基于 OverlayFS 的镜像系统为容器的分发带来了很多的便利,同时共同的镜像层只需要存储一份,实现高效率的存储;
|
||||
* 镜像系统:基于 AUFS 的镜像系统为容器的分发带来了很多的便利,同时共同的镜像层只需要存储一份,实现高效率的存储;
|
||||
* 版本管理:类似于Git的版本管理理念,用户可以更方便的创建、管理镜像文件;
|
||||
* 仓库系统:仓库系统大大降低了镜像的分发和管理的成本;
|
||||
* 周边工具:各种现有工具(配置管理、云平台)对 Docker 的支持,以及基于 Docker的 PaaS、CI 等系统,让 Docker 的应用更加方便和多样化。
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
# [CentOS](https://hub.docker.com/_/centos)
|
||||
## [CentOS](https://hub.docker.com/_/centos)
|
||||
|
||||
## 基本信息
|
||||
### 基本信息
|
||||
|
||||
[CentOS](https://en.wikipedia.org/wiki/CentOS) 是流行的 Linux 发行版,其软件包大多跟 RedHat 系列保持一致。
|
||||
|
||||
该仓库位于 `https://hub.docker.com/_/centos` ,提供了 CentOS 从 5 ~ 8 各个版本的镜像。
|
||||
该仓库位于 `https://hub.docker.com/_/centos` ,提供了 CentOS 从 5 ~ 7 各个版本的镜像。
|
||||
|
||||
## 使用方法
|
||||
### 使用方法
|
||||
|
||||
默认会启动一个最小化的 CentOS 环境。
|
||||
|
||||
@@ -15,6 +15,6 @@ $ docker run --name centos -it centos bash
|
||||
bash-4.2#
|
||||
```
|
||||
|
||||
## Dockerfile
|
||||
### Dockerfile
|
||||
|
||||
请到 https://github.com/docker-library/docs/tree/master/centos 查看。
|
||||
|
||||
@@ -1,58 +0,0 @@
|
||||
# minio
|
||||
|
||||
**MinIO** 是一个基于 Apache License v2.0 开源协议的对象存储服务。它兼容亚马逊 S3 云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几 kb 到最大 5T 不等。
|
||||
|
||||
MinIO 是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。
|
||||
|
||||
[官方文档](https://docs.min.io/)
|
||||
|
||||
## 简单使用
|
||||
|
||||
测试、开发环境下不考虑数据存储的情况下可以使用下面的命令快速开启服务。
|
||||
|
||||
```bash
|
||||
$ docker run -d -p 9000:9000 -p 9090:9090 minio/minio server /data --console-address ':9090'
|
||||
```
|
||||
|
||||
## 离线部署
|
||||
|
||||
许多生产环境是一般是没有公网资源的,这就需要从有公网资源的服务器上把镜像导出,然后导入到需要运行镜像的内网服务器。
|
||||
|
||||
### 导出镜像
|
||||
|
||||
在有公网资源的服务器上下载好`minio/minio`镜像
|
||||
|
||||
```bash
|
||||
$ docker save -o minio.tar minio/minio:latest
|
||||
```
|
||||
|
||||
> 使用docker save 的时候,也可以使用image id 来导出,但是那样导出的时候,就会丢失原来的镜像名称,推荐,还是使用镜像名字+tag来导出镜像
|
||||
|
||||
### 导入镜像
|
||||
|
||||
把压缩文件复制到内网服务器上,使用下面的命令导入镜像
|
||||
|
||||
```bash
|
||||
$ docker load minio.tar
|
||||
```
|
||||
|
||||
### 运行 minio
|
||||
|
||||
- 把 `/mnt/data` 改成要替换的数据目录
|
||||
- 替换 `MINIO_ROOT_USER` 的值
|
||||
- 替换 `MINIO_ROOT_PASSWORD` 的值
|
||||
- 替换 name,minio1(可选)
|
||||
- 如果 9000、9090 端口冲突,替换端口前面的如 `9009:9000`
|
||||
|
||||
```bash
|
||||
$ sudo docker run -d -p 9000:9000 -p 9090:9090 --name minio1 \
|
||||
-e "MINIO_ROOT_USER=改成自己需要的" \
|
||||
-e "MINIO_ROOT_PASSWORD=改成自己需要的" \
|
||||
-v /mnt/data:/data \
|
||||
--restart=always \
|
||||
minio/minio server /data --console-address ':9090'
|
||||
```
|
||||
|
||||
### 访问 web 管理页面
|
||||
|
||||
http://x.x.x.x:9090
|
||||
@@ -1,12 +1,12 @@
|
||||
# [MongoDB](https://hub.docker.com/_/mongo/)
|
||||
## [MongoDB](https://hub.docker.com/_/mongo/)
|
||||
|
||||
## 基本信息
|
||||
### 基本信息
|
||||
|
||||
[MongoDB](https://en.wikipedia.org/wiki/MongoDB) 是开源的 NoSQL 数据库实现。
|
||||
|
||||
该仓库位于 `https://hub.docker.com/_/mongo/` ,提供了 MongoDB 2.x ~ 4.x 各个版本的镜像。
|
||||
|
||||
## 使用方法
|
||||
### 使用方法
|
||||
|
||||
默认会在 `27017` 端口启动数据库。
|
||||
|
||||
@@ -29,6 +29,6 @@ $ docker run -it --rm \
|
||||
sh -c 'exec mongo "$MONGO_PORT_27017_TCP_ADDR:$MONGO_PORT_27017_TCP_PORT/test"'
|
||||
```
|
||||
|
||||
## Dockerfile
|
||||
### Dockerfile
|
||||
|
||||
请到 https://github.com/docker-library/docs/tree/master/mongo 查看。
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
# [MySQL](https://hub.docker.com/_/mysql/)
|
||||
## [MySQL](https://hub.docker.com/_/mysql/)
|
||||
|
||||
## 基本信息
|
||||
### 基本信息
|
||||
|
||||
[MySQL](https://en.wikipedia.org/wiki/MySQL) 是开源的关系数据库实现。
|
||||
|
||||
该仓库位于 `https://hub.docker.com/_/mysql/` ,提供了 MySQL 5.5 ~ 8.x 各个版本的镜像。
|
||||
|
||||
## 使用方法
|
||||
### 使用方法
|
||||
|
||||
默认会在 `3306` 端口启动数据库。
|
||||
|
||||
@@ -29,6 +29,6 @@ $ docker run -it --rm \
|
||||
sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
|
||||
```
|
||||
|
||||
## Dockerfile
|
||||
### Dockerfile
|
||||
|
||||
请到 https://github.com/docker-library/docs/tree/master/mysql 查看
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
# [Nginx](https://hub.docker.com/_/nginx/)
|
||||
## [Nginx](https://hub.docker.com/_/nginx/)
|
||||
|
||||
## 基本信息
|
||||
### 基本信息
|
||||
|
||||
[Nginx](https://en.wikipedia.org/wiki/Nginx) 是开源的高效的 Web 服务器实现,支持 HTTP、HTTPS、SMTP、POP3、IMAP 等协议。
|
||||
|
||||
该仓库位于 `https://hub.docker.com/_/nginx/` ,提供了 Nginx 1.0 ~ 1.19.x 各个版本的镜像。
|
||||
该仓库位于 `https://hub.docker.com/_/nginx/` ,提供了 Nginx 1.0 ~ 1.17.x 各个版本的镜像。
|
||||
|
||||
## 使用方法
|
||||
### 使用方法
|
||||
|
||||
下面的命令将作为一个静态页面服务器启动。
|
||||
|
||||
@@ -16,7 +16,7 @@ $ docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -d ngin
|
||||
|
||||
用户也可以不使用这种映射方式,通过利用 Dockerfile 来直接将静态页面内容放到镜像中,内容为
|
||||
|
||||
```docker
|
||||
```bash
|
||||
FROM nginx
|
||||
COPY static-html-directory /usr/share/nginx/html
|
||||
```
|
||||
@@ -39,11 +39,10 @@ Nginx的默认配置文件路径为 `/etc/nginx/nginx.conf`,可以通过映射
|
||||
```bash
|
||||
$ docker run -d \
|
||||
--name some-nginx \
|
||||
-p 8080:80 \
|
||||
-v /path/nginx.conf:/etc/nginx/nginx.conf:ro \
|
||||
-v /some/nginx.conf:/etc/nginx/nginx.conf:ro \
|
||||
nginx
|
||||
```
|
||||
|
||||
## Dockerfile
|
||||
### Dockerfile
|
||||
|
||||
请到 https://github.com/docker-library/docs/tree/master/nginx 查看。
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
# [Node.js](https://hub.docker.com/_/node/)
|
||||
## [Node.js](https://hub.docker.com/_/node/)
|
||||
|
||||
## 基本信息
|
||||
### 基本信息
|
||||
|
||||
[Node.js](https://en.wikipedia.org/wiki/Node.js) 是基于 JavaScript 的可扩展服务端和网络软件开发平台。
|
||||
|
||||
该仓库位于 `https://hub.docker.com/_/node/` ,提供了 Node.js 0.10 ~ 14.x 各个版本的镜像。
|
||||
该仓库位于 `https://hub.docker.com/_/node/` ,提供了 Node.js 0.10 ~ 12.x 各个版本的镜像。
|
||||
|
||||
## 使用方法
|
||||
### 使用方法
|
||||
|
||||
在项目中创建一个 Dockerfile。
|
||||
|
||||
```docker
|
||||
FROM node:12
|
||||
```bash
|
||||
FROM node:9
|
||||
# replace this with your application's default port
|
||||
EXPOSE 8888
|
||||
```
|
||||
@@ -31,10 +31,10 @@ $ docker run -it --rm \
|
||||
# -v "$(pwd)":/usr/src/myapp \
|
||||
--mount type=bind,src=`$(pwd)`,target=/usr/src/myapp \
|
||||
-w /usr/src/myapp \
|
||||
node:12-alpine \
|
||||
node:9-alpine \
|
||||
node your-daemon-or-script.js
|
||||
```
|
||||
|
||||
## Dockerfile
|
||||
### Dockerfile
|
||||
|
||||
请到 https://github.com/docker-library/docs/tree/master/node 查看。
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
# [PHP](https://hub.docker.com/_/php/)
|
||||
## [PHP](https://hub.docker.com/_/php/)
|
||||
|
||||
## 基本信息
|
||||
### 基本信息
|
||||
|
||||
[PHP](https://en.wikipedia.org/wiki/Php)(Hypertext Preprocessor 超文本预处理器的字母缩写)是一种被广泛应用的开放源代码的多用途脚本语言,它可嵌入到 HTML 中,尤其适合 web 开发。
|
||||
[PHP](https://en.wikipedia.org/wiki/php)(Hypertext Preprocessor 超文本预处理器的字母缩写)是一种被广泛应用的开放源代码的多用途脚本语言,它可嵌入到 HTML 中,尤其适合 web 开发。
|
||||
|
||||
该仓库位于 `https://hub.docker.com/_/php/` ,提供了 PHP 5.x ~ 8.x 各个版本的镜像。
|
||||
该仓库位于 `https://hub.docker.com/_/php/` ,提供了 PHP 5.x ~ 7.x 各个版本的镜像。
|
||||
|
||||
## 使用方法
|
||||
### 使用方法
|
||||
|
||||
下面的命令将运行一个已有的 PHP 脚本。
|
||||
|
||||
@@ -14,6 +14,6 @@
|
||||
$ docker run -it --rm -v "$PWD":/app -w /app php:alpine php your-script.php
|
||||
```
|
||||
|
||||
## Dockerfile
|
||||
### Dockerfile
|
||||
|
||||
请到 https://github.com/docker-library/docs/tree/master/php 查看。
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
# [Redis](https://hub.docker.com/_/redis/)
|
||||
## [Redis](https://hub.docker.com/_/redis/)
|
||||
|
||||
## 基本信息
|
||||
### 基本信息
|
||||
|
||||
[Redis](https://en.wikipedia.org/wiki/Redis) 是开源的内存 Key-Value 数据库实现。
|
||||
|
||||
该仓库位于 `https://hub.docker.com/_/redis/` ,提供了 Redis 3.x ~ 6.x 各个版本的镜像。
|
||||
该仓库位于 `https://hub.docker.com/_/redis/` ,提供了 Redis 3.x ~ 5.x 各个版本的镜像。
|
||||
|
||||
## 使用方法
|
||||
### 使用方法
|
||||
|
||||
默认会在 `6379` 端口启动数据库。
|
||||
|
||||
@@ -37,6 +37,6 @@ $ docker run -it --rm \
|
||||
sh -c 'exec redis-cli -h "$REDIS_PORT_6379_TCP_ADDR" -p "$REDIS_PORT_6379_TCP_PORT"'
|
||||
```
|
||||
|
||||
## Dockerfile
|
||||
### Dockerfile
|
||||
|
||||
请到 https://github.com/docker-library/docs/tree/master/redis 查看。
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
# [Ubuntu](https://hub.docker.com/_/ubuntu/)
|
||||
## [Ubuntu](https://hub.docker.com/_/ubuntu/)
|
||||
|
||||
## 基本信息
|
||||
### 基本信息
|
||||
|
||||
[Ubuntu](https://en.wikipedia.org/wiki/Ubuntu) 是流行的 Linux 发行版,其自带软件版本往往较新一些。
|
||||
|
||||
该仓库位于 `https://hub.docker.com/_/ubuntu/` ,提供了 Ubuntu 从 12.04 ~ 20.04 各个版本的镜像。
|
||||
该仓库位于 `https://hub.docker.com/_/ubuntu/` ,提供了 Ubuntu 从 12.04 ~ 19.04 各个版本的镜像。
|
||||
|
||||
## 使用方法
|
||||
### 使用方法
|
||||
|
||||
默认会启动一个最小化的 Ubuntu 环境。
|
||||
|
||||
```bash
|
||||
$ docker run --name some-ubuntu -it ubuntu:20.04
|
||||
$ docker run --name some-ubuntu -it ubuntu:18.04
|
||||
root@523c70904d54:/#
|
||||
```
|
||||
|
||||
## Dockerfile
|
||||
### Dockerfile
|
||||
|
||||
请到 https://github.com/docker-library/docs/tree/master/ubuntu 查看。
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
# [WordPress](https://hub.docker.com/_/wordpress/)
|
||||
## [WordPress](https://hub.docker.com/_/wordpress/)
|
||||
|
||||
## 基本信息
|
||||
### 基本信息
|
||||
|
||||
[WordPress](https://en.wikipedia.org/wiki/WordPress) 是开源的 Blog 和内容管理系统框架,它基于 PHP 和 MySQL。
|
||||
|
||||
该仓库位于 `https://hub.docker.com/_/wordpress/` ,提供了 WordPress 4.x ~ 5.x 版本的镜像。
|
||||
|
||||
## 使用方法
|
||||
### 使用方法
|
||||
|
||||
启动容器需要 MySQL 的支持,默认端口为 `80`。
|
||||
|
||||
@@ -20,6 +20,6 @@ $ docker run --name some-wordpress --link some-mysql:mysql -d wordpress
|
||||
* `WORDPRESS_DB_PASSWORD` 缺省为连接 mysql 容器的环境变量 `MYSQL_ROOT_PASSWORD` 的值
|
||||
* `WORDPRESS_DB_NAME` 缺省为 `wordpress`
|
||||
|
||||
## Dockerfile
|
||||
### Dockerfile
|
||||
|
||||
请到 https://github.com/docker-library/docs/tree/master/wordpress 查看。
|
||||
|
||||
@@ -3,11 +3,10 @@
|
||||
## 官方网站
|
||||
|
||||
* Docker 官方主页:https://www.docker.com
|
||||
* Docker 官方博客:https://www.docker.com/blog/
|
||||
* Docker 官方博客:https://blog.docker.com/
|
||||
* Docker 官方文档:https://docs.docker.com/
|
||||
* Docker Hub:https://hub.docker.com
|
||||
* Docker 的源代码仓库:https://github.com/moby/moby
|
||||
* Docker 路线图 https://github.com/docker/roadmap/projects
|
||||
* Docker 发布版本历史:https://docs.docker.com/release-notes/
|
||||
* Docker 常见问题:https://docs.docker.com/engine/faq/
|
||||
* Docker 远端应用 API:https://docs.docker.com/develop/sdk/
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
# 归档项目
|
||||
|
||||
以下项目不被官方支持或内容陈旧,将在下一版本中删除(或已经删除)。
|
||||
|
||||
* [Docker Machine](https://github.com/yeasy/docker_practice/tree/ca29ab51b121f43563f5d6659dedbda5cb6f048d/machine)
|
||||
* [Docker Swarm](https://github.com/yeasy/docker_practice/tree/ca29ab51b121f43563f5d6659dedbda5cb6f048d/swarm)
|
||||
* Mesos
|
||||
@@ -1,8 +1,7 @@
|
||||
# 基本概念
|
||||
# Basic Concepts
|
||||
Docker contains 3 basic concepts
|
||||
* `Image`
|
||||
* `Container`
|
||||
* `Repository`
|
||||
|
||||
**Docker** 包括三个基本概念
|
||||
* **镜像**(`Image`)
|
||||
* **容器**(`Container`)
|
||||
* **仓库**(`Repository`)
|
||||
|
||||
理解了这三个概念,就理解了 **Docker** 的整个生命周期。
|
||||
Only after knowing the above 3 concepts will we get a deeper understanding of the lifecyle of docker.
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
# Docker 容器
|
||||
## Docker Container
|
||||
|
||||
镜像(`Image`)和容器(`Container`)的关系,就像是面向对象程序设计中的 `类` 和 `实例` 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
|
||||
The relationship between `Image` and `Container` is just as `Class` and `Instance` in [OOP](https://en.wikipedia.org/wiki/Object-oriented_programming). `Image` is the static definition of `container`, while `containers` are the `images` in running state. `Containers` can be created, started, paused, deleted or stopped.
|
||||
|
||||
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 [命名空间](https://en.wikipedia.org/wiki/Linux_namespaces)。因此容器可以拥有自己的 `root` 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。也因为这种隔离的特性,很多人初学 Docker 时常常会混淆容器和虚拟机。
|
||||
The essence of `container` is `process`, but different from that in the host OS, the container processes run in their individual [`namespaces`](https://en.wikipedia.org/wiki/Linux_namespaces). With the namespace, a container can have its own `root` filesystem, network configurations, process space and even an ID space for users. The processes in a container run in an isolated environment, thus can be used as if it were an individual OS independent of the host OS. This feature makes docker-encapsulated applications safer than those running directly on the host. And that's also an important factor that confuses the novices to tell it from virtual machines.
|
||||
|
||||
前面讲过镜像使用的是分层存储,容器也是如此。每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为 **容器存储层**。
|
||||
As we've discussed, `multi-layered filesystem` is applied to images, and so as the containers. When a container is running, it is based on its image, with a writable layer created on top of it. We call this layer prepared for R/W at runtime [**`Container Layer`**](https://docs.docker.com/storage/storagedriver/#images-and-layers).
|
||||
|
||||
容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。
|
||||
The lifecyle of the container layer is the same as contaier. The container layer dies as soon as the container dies. Therefore, anything stored at the container layer will be discarded when the container is deleted.
|
||||
|
||||
按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 [数据卷(Volume)](../data_management/volume.md)、或者 [绑定宿主目录](../data_management/bind-mounts.md),在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
|
||||
As recommended by the [Docker Development Best Practices](https://docs.docker.com/develop/dev-best-practices/#where-and-how-to-persist-application-data), we should not write any data to the container layer to make it stateless. All file write operations should adhere to [`Volume`](../data_management/volume.md) or bind mounts. Writing to volume or bind mounts skips the container layer and R/W to host storage(or network storage) directly, which achieves better performance and stability.
|
||||
|
||||
数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。
|
||||
The lifecyle of volume is independent of the container, and will not vanish when the container is deleted. In light of it, the data persists when a container is deleted or restarted.
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
# Docker 镜像
|
||||
## Docker Image
|
||||
|
||||
我们都知道,操作系统分为 **内核** 和 **用户空间**。对于 `Linux` 而言,内核启动后,会挂载 `root` 文件系统为其提供用户空间支持。而 **Docker 镜像**(`Image`),就相当于是一个 `root` 文件系统。比如官方镜像 `ubuntu:18.04` 就包含了完整的一套 Ubuntu 18.04 最小系统的 `root` 文件系统。
|
||||
As we all know, Operating System consists of kernel space and user space. For linux, it will mount `root` filesystem to support user space. For Docker Image, it is similar to a `root` filesystem in Linux. For example, the offical image `ubuntu:18:04` contains a micro `root` filesystem of complete opreating system.
|
||||
|
||||
**Docker 镜像** 是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像 **不包含** 任何动态数据,其内容在构建之后也不会被改变。
|
||||
Docker Image is a special filesystem. Apart from programs, libs, resources and config which support running container, Docker Image also includes config parameters like anonymous volumes, environment variables, users and others. Images don't have any dynamic data. Its content will not be changed after build.
|
||||
|
||||
## 分层存储
|
||||
## Advanced Multi-layered Unification Filesystem (AUFS)
|
||||
|
||||
因为镜像包含操作系统完整的 `root` 文件系统,其体积往往是庞大的,因此在 Docker 设计时,就充分利用 [Union FS](https://en.wikipedia.org/wiki/Union_mount) 的技术,将其设计为分层存储的架构。所以严格来说,镜像并非是像一个 `ISO` 那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。
|
||||
Because the image contains the complete `root` file system of the operating system, its volume is often huge. So Docker made full use of [Union FS](https://en.wikipedia.org/wiki/Union_mount) and was designed as AUFS when it was designed. So strictly speaking, image is not a packaged file like an ISO image file. Image is just a virtual concept. It is not composed of a single file, but a group of file systems, or a combination of multi-layered filesystems.
|
||||
|
||||
镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。
|
||||
When building an image, it builds layer by layer, and the former is the basis for the latter. Once each layer is built, it will not change later. Any change on the latter layer will only occur on its own level. For example, deleting the previous layer of files is not really deleting the files, but only marked as deleted in the current layer. When the final container runs, you won't see the file, but in fact the file will always follow the image. Therefore, take more care when building the image, and any redundant file should be cleared up in ahead of the layer's final construction.
|
||||
|
||||
分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。
|
||||
The layered storage feature also makes it easier to reuse and customize images. You can even use a previously built image as the base layer, and then add a new layer to customize the content to meet your need to build a new image.
|
||||
|
||||
关于镜像构建,将会在后续相关章节中做进一步的讲解。
|
||||
As for image building, further explanations will be given in subsequent relevant chapters.
|
||||
|
||||
@@ -1,29 +1,29 @@
|
||||
# Docker Registry
|
||||
## Docker Registry
|
||||
|
||||
镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,[Docker Registry](../repository/registry.md) 就是这样的服务。
|
||||
After the construction of an image, we can easily run it on a host. However, if we want to use the image on other servers, we need a centralized image storage and distribution service. The [Docker Registry](../repository/registry.md) we will introduce is such a service.
|
||||
|
||||
一个 **Docker Registry** 中可以包含多个 **仓库**(`Repository`);每个仓库可以包含多个 **标签**(`Tag`);每个标签对应一个镜像。
|
||||
A **Docker Registry** can contain several `Repositories`, where each repository can contain several tags and each tag corresponds to an image.
|
||||
|
||||
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 `<仓库名>:<标签>` 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 `latest` 作为默认标签。
|
||||
Typically, a repository contains images for different versions of the same software, where each tags corresponds to different versions of the software. We can uniquely identify an image of the same software with `repository:tag`. In case not explicitly specified, `latest` is taken as default tag.
|
||||
|
||||
以 [Ubuntu 镜像](https://hub.docker.com/_/ubuntu) 为例,`ubuntu` 是仓库的名字,其内包含有不同的版本标签,如,`16.04`, `18.04`。我们可以通过 `ubuntu:16.04`,或者 `ubuntu:18.04` 来具体指定所需哪个版本的镜像。如果忽略了标签,比如 `ubuntu`,那将视为 `ubuntu:latest`。
|
||||
Taking the [Ubuntu Image](https://hub.docker.com/_/ubuntu) as an example. `ubuntu` is the name for repository, and inside it are tags for different versions, for instance, `16.04`, `18.04`. We can use `ubuntu:16.04` or `ubuntu:18.04` to specify the particular image we want. If the tag is omitted, for example, `ubuntu`, then it will be considered as `ubuntu:latest`.
|
||||
|
||||
仓库名经常以 *两段式路径* 形式出现,比如 `jwilder/nginx-proxy`,前者往往意味着 Docker Registry 多用户环境下的用户名,后者则往往是对应的软件名。但这并非绝对,取决于所使用的具体 Docker Registry 的软件或服务。
|
||||
Repository name is typically seperated by a forward slash(/), for example, `jwilder/nginx-proxy`, the former is to identify a particular user in a multi-user Docker Registry, while the latter corresponds to the software name. But it is not always the case. It also depends on the Docker Registry software or service you are using.
|
||||
|
||||
## Docker Registry 公开服务
|
||||
### Docker Registry Public Services
|
||||
|
||||
Docker Registry 公开服务是开放给用户使用、允许用户管理镜像的 Registry 服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。
|
||||
`Docker Registry Public Services` are registry services open to users, allowing users to manage their images. Typically, those public services offer user free image uploads and downloads, and possibly provide charged service for privately managed images.
|
||||
|
||||
最常使用的 Registry 公开服务是官方的 [Docker Hub](https://hub.docker.com/),这也是默认的 Registry,并拥有大量的高质量的 [官方镜像](https://hub.docker.com/search?q=&type=image&image_filter=official)。除此以外,还有 Red Hat 的 [Quay.io](https://quay.io/repository/);Google 的 [Google Container Registry](https://cloud.google.com/container-registry/),[Kubernetes](https://kubernetes.io/) 的镜像使用的就是这个服务;代码托管平台 [GitHub](https://github.com) 推出的 [ghcr.io](https://docs.github.com/cn/packages/working-with-a-github-packages-registry/working-with-the-container-registry)。
|
||||
The most commonly used registry public service is the official [Docker Hub](https://hub.docker.com/), which is the default registry with thousands of high quality official images. Besides, the images for [Quay.io](https://quay.io/repository/) and CoreOS of [CoreOS](https://coreos.com/) are stored there. Google's [Google Container Registry](https://cloud.google.com/container-registry/) and [Kubernetes](https://kubernetes.io/) also use this service.
|
||||
|
||||
由于某些原因,在国内访问这些服务可能会比较慢。国内的一些云服务商提供了针对 Docker Hub 的镜像服务(`Registry Mirror`),这些镜像服务被称为 **加速器**。常见的有 [阿里云加速器](https://www.aliyun.com/product/acr?source=5176.11533457&userCode=8lx5zmtu)、[DaoCloud 加速器](https://www.daocloud.io/mirror#accelerator-doc) 等。使用加速器会直接从国内的地址下载 Docker Hub 的镜像,比直接从 Docker Hub 下载速度会提高很多。在 [安装 Docker](../install/mirror.md) 一节中有详细的配置方法。
|
||||
Due to some reasons knwon to all, accessing those services from China mainland is slow. There are some cloud service providers in China providing `Registry Mirror` for Docker Hub, those mirror services are called `accelerators`. The well-known ones are [Ali Cloud Image Accelerator](https://cr.console.aliyun.com/#/accelerator) and [DaoCloud Accelerator](https://www.daocloud.io/mirror#accelerator-doc). In China, downloading from these services are much faster than from Docker Hub. The detailed image source configuration tutorial is in the [Docker Installation](../install/mirror.md) section.
|
||||
|
||||
国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 [网易云镜像服务](https://c.163.com/hub#/m/library/)、[DaoCloud 镜像市场](https://hub.daocloud.io/)、[阿里云镜像库](https://www.aliyun.com/product/acr?source=5176.11533457&userCode=8lx5zmtu) 等。
|
||||
There are also some cloud service providers that provide public services similar to Docker Hub in China. For example, [Tenxcloud Mirror Registry](https://hub.tenxcloud.com/), [NetEase Mirror Registry](https://c.163.com/hub#/m/library/), [DaoCloud Mirror Market](https://hub.daocloud.io/), [Ali Cloud Mirror Registry](https://cr.console.aliyun.com), etc.
|
||||
|
||||
## 私有 Docker Registry
|
||||
### Private Docker Registry
|
||||
|
||||
除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry。Docker 官方提供了 [Docker Registry](https://hub.docker.com/_/registry/) 镜像,可以直接使用做为私有 Registry 服务。在 [私有仓库](../repository/registry.md) 一节中,会有进一步的搭建私有 Registry 服务的讲解。
|
||||
Apart from using public service, a user can set up private Docker Registry. Docker offical offers the [Docker Registry](https://hub.docker.com/_/registry/) docker image, which can be deployed for private registry service. We will explain how to set it up in detail in the [Private Registry](../repository/registry.md) section.
|
||||
|
||||
开源的 Docker Registry 镜像只提供了 [Docker Registry API](https://docs.docker.com/registry/spec/api/) 的服务端实现,足以支持 `docker` 命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。
|
||||
The open source Docker Registry image only provides the backend of [Docker Registry API](https://docs.docker.com/registry/spec/api/), which supports the `docker` commands and is enough for personal use, although the advanced functionalities like GUI(Graphical User Interface), Image Maintenance and Access Control are not supported. However, they are provided in the commercial version - [Docker Trusted Registry](https://docs.docker.com/datacenter/dtr/2.0/).
|
||||
|
||||
除了官方的 Docker Registry 外,还有第三方软件实现了 Docker Registry API,甚至提供了用户界面以及一些高级功能。比如,[Harbor](https://github.com/goharbor/harbor) 和 [Sonatype Nexus](../repository/nexus3_registry.md)。
|
||||
Except for the official Docker Registry, there are third-party softwares that implement Docker Registry API, even with some advanced features like user interface. For example, [Harbor](https://github.com/goharbor/harbor) and [Sonatype Nexus](../repository/nexus3_registry.md).
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"title": "Docker -- 从入门到实践",
|
||||
"title": "Docker Practice",
|
||||
"author": "yeasy",
|
||||
"language": "zh-hans",
|
||||
"language": "en",
|
||||
"links": {
|
||||
"sidebar": {
|
||||
"GitHub": "https://github.com/yeasy/docker_practice"
|
||||
@@ -19,14 +19,13 @@
|
||||
"attributes": {
|
||||
"width": "600"
|
||||
},
|
||||
"caption": "图 _PAGE_LEVEL_._PAGE_IMAGE_NUMBER_ - _CAPTION_"
|
||||
"caption": "Image _PAGE_LEVEL_._PAGE_IMAGE_NUMBER_ - _CAPTION_"
|
||||
},
|
||||
"github": {
|
||||
"url": "https://github.com/yeasy/docker_practice"
|
||||
},
|
||||
"editlink": {
|
||||
"base": "https://github.com/yeasy/docker_practice/blob/master/",
|
||||
"label": "编辑本页"
|
||||
"base": "https://github.com/yeasy/docker_practice/blob/english/"
|
||||
},
|
||||
"page-treeview": {
|
||||
"copyright": "Copyright © yeasy",
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
# Docker Buildx
|
||||
|
||||
Docker Buildx 是一个 docker CLI 插件,其扩展了 docker 命令,支持 [Moby BuildKit](buildkit.md) 提供的功能。提供了与 docker build 相同的用户体验,并增加了许多新功能。
|
||||
|
||||
> 该功能仅适用于 Docker v19.03+ 版本
|
||||
@@ -1,17 +0,0 @@
|
||||
# 使用 Buildx 构建镜像
|
||||
|
||||
## 使用
|
||||
|
||||
你可以直接使用 `docker buildx build` 命令构建镜像。
|
||||
|
||||
```bash
|
||||
$ docker buildx build .
|
||||
[+] Building 8.4s (23/32)
|
||||
=> ...
|
||||
```
|
||||
|
||||
Buildx 使用 [BuildKit 引擎](buildkit.md) 进行构建,支持许多新的功能,具体参考 [Buildkit](buildkit.md) 一节。
|
||||
|
||||
## 官方文档
|
||||
|
||||
* https://docs.docker.com/engine/reference/commandline/buildx/
|
||||
@@ -1,126 +0,0 @@
|
||||
# 使用 buildx 构建多种系统架构支持的 Docker 镜像
|
||||
|
||||
在之前的版本中构建多种系统架构支持的 Docker 镜像,要想使用统一的名字必须使用 [`$ docker manifest`](../image/manifest.md) 命令。
|
||||
|
||||
在 Docker 19.03+ 版本中可以使用 `$ docker buildx build` 命令使用 `BuildKit` 构建镜像。该命令支持 `--platform` 参数可以同时构建支持多种系统架构的 Docker 镜像,大大简化了构建步骤。
|
||||
|
||||
## 新建 `builder` 实例
|
||||
|
||||
Docker for Linux 不支持构建 `arm` 架构镜像,我们可以运行一个新的容器让其支持该特性,Docker 桌面版无需进行此项设置。
|
||||
|
||||
```bash
|
||||
$ docker run --rm --privileged tonistiigi/binfmt:latest --install all
|
||||
```
|
||||
|
||||
由于 Docker 默认的 `builder` 实例不支持同时指定多个 `--platform`,我们必须首先创建一个新的 `builder` 实例。同时由于国内拉取镜像较缓慢,我们可以使用配置了 [镜像加速地址](https://github.com/moby/buildkit/blob/master/docs/buildkitd.toml.md) 的 [`dockerpracticesig/buildkit:master`](https://github.com/docker-practice/buildx) 镜像替换官方镜像。
|
||||
|
||||
> 如果你有私有的镜像加速器,可以基于 https://github.com/docker-practice/buildx 构建自己的 buildkit 镜像并使用它。
|
||||
|
||||
```bash
|
||||
# 适用于国内环境
|
||||
$ docker buildx create --use --name=mybuilder-cn --driver docker-container --driver-opt image=dockerpracticesig/buildkit:master
|
||||
|
||||
# 适用于腾讯云环境(腾讯云主机、coding.net 持续集成)
|
||||
$ docker buildx create --use --name=mybuilder-cn --driver docker-container --driver-opt image=dockerpracticesig/buildkit:master-tencent
|
||||
|
||||
# $ docker buildx create --name mybuilder --driver docker-container
|
||||
|
||||
$ docker buildx use mybuilder
|
||||
```
|
||||
|
||||
## 构建镜像
|
||||
|
||||
新建 Dockerfile 文件。
|
||||
|
||||
```docker
|
||||
FROM --platform=$TARGETPLATFORM alpine
|
||||
|
||||
RUN uname -a > /os.txt
|
||||
|
||||
CMD cat /os.txt
|
||||
```
|
||||
|
||||
使用 `$ docker buildx build` 命令构建镜像,注意将 `myusername` 替换为自己的 Docker Hub 用户名。
|
||||
|
||||
`--push` 参数表示将构建好的镜像推送到 Docker 仓库。
|
||||
|
||||
```bash
|
||||
$ docker buildx build --platform linux/arm,linux/arm64,linux/amd64 -t myusername/hello . --push
|
||||
|
||||
# 查看镜像信息
|
||||
$ docker buildx imagetools inspect myusername/hello
|
||||
```
|
||||
|
||||
在不同架构运行该镜像,可以得到该架构的信息。
|
||||
|
||||
```bash
|
||||
# arm
|
||||
$ docker run -it --rm myusername/hello
|
||||
Linux buildkitsandbox 4.9.125-linuxkit #1 SMP Fri Sep 7 08:20:28 UTC 2018 armv7l Linux
|
||||
|
||||
# arm64
|
||||
$ docker run -it --rm myusername/hello
|
||||
Linux buildkitsandbox 4.9.125-linuxkit #1 SMP Fri Sep 7 08:20:28 UTC 2018 aarch64 Linux
|
||||
|
||||
# amd64
|
||||
$ docker run -it --rm myusername/hello
|
||||
Linux buildkitsandbox 4.9.125-linuxkit #1 SMP Fri Sep 7 08:20:28 UTC 2018 x86_64 Linux
|
||||
```
|
||||
|
||||
## 架构相关变量
|
||||
|
||||
`Dockerfile` 支持如下架构相关的变量
|
||||
|
||||
**TARGETPLATFORM**
|
||||
|
||||
构建镜像的目标平台,例如 `linux/amd64`, `linux/arm/v7`, `windows/amd64`。
|
||||
|
||||
**TARGETOS**
|
||||
|
||||
`TARGETPLATFORM` 的 OS 类型,例如 `linux`, `windows`
|
||||
|
||||
**TARGETARCH**
|
||||
|
||||
`TARGETPLATFORM` 的架构类型,例如 `amd64`, `arm`
|
||||
|
||||
**TARGETVARIANT**
|
||||
|
||||
`TARGETPLATFORM` 的变种,该变量可能为空,例如 `v7`
|
||||
|
||||
**BUILDPLATFORM**
|
||||
|
||||
构建镜像主机平台,例如 `linux/amd64`
|
||||
|
||||
**BUILDOS**
|
||||
|
||||
`BUILDPLATFORM` 的 OS 类型,例如 `linux`
|
||||
|
||||
**BUILDARCH**
|
||||
|
||||
`BUILDPLATFORM` 的架构类型,例如 `amd64`
|
||||
|
||||
**BUILDVARIANT**
|
||||
|
||||
`BUILDPLATFORM` 的变种,该变量可能为空,例如 `v7`
|
||||
|
||||
### 使用举例
|
||||
|
||||
例如我们要构建支持 `linux/arm/v7` 和 `linux/amd64` 两种架构的镜像。假设已经生成了两个平台对应的二进制文件:
|
||||
|
||||
* `bin/dist-linux-arm`
|
||||
* `bin/dist-linux-amd64`
|
||||
|
||||
那么 `Dockerfile` 可以这样书写:
|
||||
|
||||
```docker
|
||||
FROM scratch
|
||||
|
||||
# 使用变量必须申明
|
||||
ARG TARGETOS
|
||||
|
||||
ARG TARGETARCH
|
||||
|
||||
COPY bin/dist-${TARGETOS}-${TARGETARCH} /dist
|
||||
|
||||
ENTRYPOINT ["dist"]
|
||||
```
|
||||
|
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 72 KiB |
@@ -1,7 +1,7 @@
|
||||
# CI/CD
|
||||
|
||||
**持续集成(Continuous integration)** 是一种软件开发实践,每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。
|
||||
持续集成(Continuous integration)是一种软件开发实践,每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。
|
||||
|
||||
**持续部署(continuous deployment)** 是通过自动化的构建、测试和部署循环来快速交付高质量的产品。
|
||||
持续部署(continuous deployment)是通过自动化的构建、测试和部署循环来快速交付高质量的产品。
|
||||
|
||||
与 `Jenkins` 不同的是,基于 Docker 的 CI/CD 每一步都运行在 Docker 容器中,所以理论上支持所有的编程语言。
|
||||
与 `Jenkins` 不同的是,基于 Docker 的 CI/CD 每一步都运行在 Docker 镜像中,所以理论上支持所有的编程语言。
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# GitHub Actions
|
||||
|
||||
GitHub [Actions](https://github.com/features/actions) 是 GitHub 推出的一款 CI/CD 工具。
|
||||
GitGub Actions 是 GitHub 推出的一款 CI/CD 工具。
|
||||
|
||||
我们可以在每个 `job` 的 `step` 中使用 Docker 执行构建步骤。
|
||||
我们可以在每个 job 的 step 中使用 Docker 执行构建步骤。
|
||||
|
||||
```yaml
|
||||
on: push
|
||||
@@ -25,4 +25,4 @@ jobs:
|
||||
|
||||
## 参考资料
|
||||
|
||||
* [Actions Docs](https://docs.github.com/en/actions)
|
||||
* [Actions Docs](https://help.github.com/en/categories/automating-your-workflow-with-github-actions)
|
||||
|
||||
@@ -86,7 +86,7 @@ $ git push origin master
|
||||
|
||||
打开我们部署好的 `Drone` 网站或者 Drone Cloud,即可看到构建结果。
|
||||
|
||||

|
||||

|
||||
|
||||
当然我们也可以把构建结果上传到 GitHub,Docker Registry,云服务商提供的对象存储,或者生产环境中。
|
||||
|
||||
@@ -95,5 +95,5 @@ $ git push origin master
|
||||
## 参考链接
|
||||
|
||||
* [Drone Github](https://github.com/drone/drone)
|
||||
* [Drone 文档](https://docs.drone.io/)
|
||||
* [Drone 文档](http://docs.drone.io/)
|
||||
* [Drone 示例](https://github.com/docker-practice/drone-demo)
|
||||
|
||||
@@ -3,7 +3,7 @@ version: '3'
|
||||
services:
|
||||
|
||||
drone-server:
|
||||
image: drone/drone:2.3.1
|
||||
image: drone/drone:1
|
||||
ports:
|
||||
- 443:443
|
||||
- 80:80
|
||||
@@ -12,6 +12,7 @@ services:
|
||||
- ./ssl:/etc/certs
|
||||
restart: always
|
||||
environment:
|
||||
- DRONE_AGENTS_ENABLED=true
|
||||
- DRONE_SERVER_HOST=${DRONE_SERVER_HOST:-drone.domain.com}
|
||||
- DRONE_SERVER_PROTO=${DRONE_SERVER_PROTO:-https}
|
||||
- DRONE_RPC_SECRET=${DRONE_RPC_SECRET:-secret}
|
||||
@@ -20,7 +21,7 @@ services:
|
||||
- DRONE_GITHUB_CLIENT_SECRET=${DRONE_GITHUB_CLIENT_SECRET}
|
||||
|
||||
drone-agent:
|
||||
image: drone/drone-runner-docker:1
|
||||
image: drone/agent:1
|
||||
restart: always
|
||||
depends_on:
|
||||
- drone-server
|
||||
|
||||
@@ -30,7 +30,7 @@ version: '3'
|
||||
services:
|
||||
|
||||
drone-server:
|
||||
image: drone/drone:2.3.1
|
||||
image: drone/drone:1
|
||||
ports:
|
||||
- 443:443
|
||||
- 80:80
|
||||
@@ -39,6 +39,7 @@ services:
|
||||
- ./ssl:/etc/certs
|
||||
restart: always
|
||||
environment:
|
||||
- DRONE_AGENTS_ENABLED=true
|
||||
- DRONE_SERVER_HOST=${DRONE_SERVER_HOST:-https://drone.yeasy.com}
|
||||
- DRONE_SERVER_PROTO=${DRONE_SERVER_PROTO:-https}
|
||||
- DRONE_RPC_SECRET=${DRONE_RPC_SECRET:-secret}
|
||||
@@ -47,7 +48,7 @@ services:
|
||||
- DRONE_GITHUB_CLIENT_SECRET=${DRONE_GITHUB_CLIENT_SECRET}
|
||||
|
||||
drone-agent:
|
||||
image: drone/drone-runner-docker:1
|
||||
image: drone/agent:1
|
||||
restart: always
|
||||
depends_on:
|
||||
- drone-server
|
||||
|
||||
47
cases/ci/travis/README.md
Normal file
47
cases/ci/travis/README.md
Normal file
@@ -0,0 +1,47 @@
|
||||
## 在 Travis CI 中使用 Docker
|
||||
|
||||
当代码提交到 GitHub 时,[Travis CI](https://travis-ci.com/) 会根据项目根目录 `.travis.yml` 文件设置的指令,执行一系列操作。
|
||||
|
||||
本小节介绍如何在 Travis CI 中使用 Docker 进行持续集成/持续部署(CI/CD)。这里以当代码提交到 GitHub 时自动构建 Docker 镜像并推送到 Docker Hub 为例进行介绍。
|
||||
|
||||
### 准备
|
||||
|
||||
首先登录 https://travis-ci.com/account/repositories 选择 GitHub 仓库,按照指引安装 GitHub App 来启用 GitHub 仓库构建。
|
||||
|
||||
在项目根目录新建一个 `Dockerfile` 文件。
|
||||
|
||||
```dockerfile
|
||||
FROM alpine
|
||||
|
||||
RUN echo "Hello World"
|
||||
```
|
||||
|
||||
新建 Travis CI 配置文件 `.travis.yml` 文件。
|
||||
|
||||
```yml
|
||||
language: bash
|
||||
|
||||
dist: xenial
|
||||
|
||||
services:
|
||||
- docker
|
||||
|
||||
before_script:
|
||||
# 登录到 docker hub
|
||||
- echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
|
||||
|
||||
script:
|
||||
# 这里编写测试代码的命令
|
||||
- echo "test code"
|
||||
|
||||
after_success:
|
||||
# 当代码测试通过后执行的命令
|
||||
- docker build -t username/alpine .
|
||||
- docker push username/alpine
|
||||
```
|
||||
|
||||
> 请提前在 Travis CI 仓库设置页面配置 `DOCKER_PASSWORD` `DOCKER_USERNAME` 变量
|
||||
|
||||
### 查看结果
|
||||
|
||||
将项目推送到 GitHub, 登录 [Travis CI](https://travis-ci.com/) 查看构建详情。
|
||||
16
cases/ci/travis/demo/.travis.yml
Normal file
16
cases/ci/travis/demo/.travis.yml
Normal file
@@ -0,0 +1,16 @@
|
||||
language: bash
|
||||
|
||||
dist: xenial
|
||||
|
||||
services:
|
||||
- docker
|
||||
|
||||
before_script:
|
||||
- echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
|
||||
|
||||
script:
|
||||
- echo "test code"
|
||||
|
||||
after_success:
|
||||
- docker build -t username/alpine .
|
||||
- docker push username/alpine
|
||||
3
cases/ci/travis/demo/Dockerfile
Normal file
3
cases/ci/travis/demo/Dockerfile
Normal file
@@ -0,0 +1,3 @@
|
||||
FROM alpine
|
||||
|
||||
RUN echo "Hello World"
|
||||
@@ -1,9 +1,9 @@
|
||||
# 操作系统
|
||||
|
||||
目前常用的 Linux 发行版主要包括 `Debian/Ubuntu` 系列和 `CentOS/Fedora` 系列。
|
||||
目前常用的 Linux 发行版主要包括 Debian/Ubuntu 系列和 CentOS/Fedora 系列。
|
||||
|
||||
前者以自带软件包版本较新而出名;后者则宣称运行更稳定一些。选择哪个操作系统取决于读者的具体需求。
|
||||
|
||||
使用 Docker,读者只需要一个命令就能快速获取一个 Linux 发行版镜像,这是以往包括各种虚拟化技术都难以实现的。这些镜像一般都很精简,但是可以支持完整 Linux 系统的大部分功能。
|
||||
|
||||
本章将介绍如何使用 Docker 安装和使用 `Busybox`、`Alphine`、`Debian/Ubuntu`、`CentOS/Fedora` 等操作系统。
|
||||
本章将介绍如何使用 Docker 安装和使用 Busybox、Alphine、Debian/Ubuntu、CentOS/Fedora 等操作系统。
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
# Alpine
|
||||
## Alpine
|
||||
|
||||
## 简介
|
||||
### 简介
|
||||
|
||||

|
||||

|
||||
|
||||
`Alpine` 操作系统是一个面向安全的轻型 `Linux` 发行版。它不同于通常 `Linux` 发行版,`Alpine` 采用了 `musl libc` 和 `busybox` 以减小系统的体积和运行时资源消耗,但功能上比 `busybox` 又完善的多,因此得到开源社区越来越多的青睐。在保持瘦身的同时,`Alpine` 还提供了自己的包管理工具 `apk`,可以通过 `https://pkgs.alpinelinux.org/packages` 网站上查询包信息,也可以直接通过 `apk` 命令直接查询和安装各种软件。
|
||||
|
||||
`Alpine` 由非商业组织维护的,支持广泛场景的 `Linux`发行版,它特别为资深/重度`Linux`用户而优化,关注安全,性能和资源效能。`Alpine` 镜像可以适用于更多常用场景,并且是一个优秀的可以适用于生产的基础系统/环境。
|
||||
|
||||
`Alpine` Docker 镜像也继承了 `Alpine Linux` 发行版的这些优势。相比于其他 `Docker` 镜像,它的容量非常小,仅仅只有 **5 MB** 左右(对比 `Ubuntu` 系列镜像接近 `200 MB`),且拥有非常友好的包管理机制。官方镜像来自 `docker-alpine` 项目。
|
||||
`Alpine` Docker 镜像也继承了 Alpine Linux 发行版的这些优势。相比于其他 `Docker` 镜像,它的容量非常小,仅仅只有 5 MB 左右(对比 Ubuntu 系列镜像接近 200 MB),且拥有非常友好的包管理机制。官方镜像来自 `docker-alpine` 项目。
|
||||
|
||||
目前 Docker 官方已开始推荐使用 `Alpine` 替代之前的 `Ubuntu` 做为基础镜像环境。这样会带来多个好处。包括镜像下载速度加快,镜像安全性提高,主机之间的切换更方便,占用更少磁盘空间等。
|
||||
|
||||
@@ -22,7 +22,7 @@ ubuntu latest b39b81afc8ca 188.3 MB
|
||||
centos latest 8efe422e6104 210 MB
|
||||
```
|
||||
|
||||
## 获取并使用官方镜像
|
||||
### 获取并使用官方镜像
|
||||
|
||||
由于镜像很小,下载时间往往很短,读者可以直接使用 `docker run` 指令直接运行一个 `Alpine` 容器,并指定运行的 Linux 指令,例如:
|
||||
|
||||
@@ -31,17 +31,17 @@ $ docker run alpine echo '123'
|
||||
123
|
||||
```
|
||||
|
||||
## 迁移至 `Alpine` 基础镜像
|
||||
### 迁移至 `Alpine` 基础镜像
|
||||
|
||||
目前,大部分 Docker 官方镜像都已经支持 `Alpine` 作为基础镜像,可以很容易进行迁移。
|
||||
目前,大部分 Docker 官方镜像都已经支持 Alpine 作为基础镜像,可以很容易进行迁移。
|
||||
|
||||
例如:
|
||||
|
||||
* `ubuntu/debian` -> `alpine`
|
||||
* `python:3` -> `python:3-alpine`
|
||||
* `ruby:2.6` -> `ruby:2.6-alpine`
|
||||
* ubuntu/debian -> alpine
|
||||
* python:2.7 -> python:2.7-alpine
|
||||
* ruby:2.3 -> ruby:2.3-alpine
|
||||
|
||||
另外,如果使用 `Alpine` 镜像替换 `Ubuntu` 基础镜像,安装软件包时需要用 `apk` 包管理器替换 `apt` 工具,如
|
||||
另外,如果使用 `Alpine` 镜像替换 `Ubuntu` 基础镜像,安装软件包时需要用 apk 包管理器替换 apt 工具,如
|
||||
|
||||
```bash
|
||||
$ apk add --no-cache <package>
|
||||
@@ -50,18 +50,11 @@ $ apk add --no-cache <package>
|
||||
`Alpine` 中软件安装包的名字可能会与其他发行版有所不同,可以在 `https://pkgs.alpinelinux.org/packages` 网站搜索并确定安装包名称。如果需要的安装包不在主索引内,但是在测试或社区索引中。那么可以按照以下方法使用这些安装包。
|
||||
|
||||
```bash
|
||||
$ echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories
|
||||
$ echo "http://dl-4.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories
|
||||
$ apk --update add --no-cache <package>
|
||||
```
|
||||
|
||||
由于在国内访问 `apk` 仓库较缓慢,建议在使用 `apk` 之前先替换仓库地址为国内镜像。
|
||||
|
||||
```docker
|
||||
RUN sed -i "s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g" /etc/apk/repositories \
|
||||
&& apk add --no-cache <package>
|
||||
```
|
||||
|
||||
## 相关资源
|
||||
### 相关资源
|
||||
|
||||
* `Alpine` 官网:https://www.alpinelinux.org/
|
||||
* `Alpine` 官方仓库:https://github.com/alpinelinux
|
||||
|
||||
@@ -1,27 +1,42 @@
|
||||
# Busybox
|
||||
## Busybox
|
||||
|
||||
## 简介
|
||||
### 简介
|
||||
|
||||

|
||||

|
||||
|
||||
`BusyBox` 是一个集成了一百多个最常用 Linux 命令和工具(如 `cat`、`echo`、`grep`、`mount`、`telnet` 等)的精简工具箱,它只需要几 MB 的大小,很方便进行各种快速验证,被誉为“Linux 系统的瑞士军刀”。
|
||||
BusyBox 是一个集成了一百多个最常用 Linux 命令和工具(如 cat、echo、grep、mount、telnet 等)的精简工具箱,它只需要几 MB 的大小,很方便进行各种快速验证,被誉为“Linux 系统的瑞士军刀”。
|
||||
|
||||
`BusyBox` 可运行于多款 `POSIX` 环境的操作系统中,如 `Linux`(包括 `Android`)、`Hurd`、`FreeBSD` 等。
|
||||
BusyBox 可运行于多款 POSIX 环境的操作系统中,如 Linux(包括 Android)、Hurd、FreeBSD 等。
|
||||
|
||||
## 获取官方镜像
|
||||
### 获取官方镜像
|
||||
|
||||
可以使用 `docker pull` 指令下载 `busybox:latest` 镜像:
|
||||
在 Docker Hub 中搜索 busybox 相关的镜像。
|
||||
|
||||
```bash
|
||||
$ docker search busybox
|
||||
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
|
||||
busybox Busybox base image. 755 [OK]
|
||||
progrium/busybox 63 [OK]
|
||||
radial/busyboxplus Full-chain, Internet enabled, busybox made... 11 [OK]
|
||||
odise/busybox-python 3 [OK]
|
||||
multiarch/busybox multiarch ports of ubuntu-debootstrap 2 [OK]
|
||||
azukiapp/busybox This image is meant to be used as the base... 2 [OK]
|
||||
...
|
||||
```
|
||||
|
||||
读者可以看到最受欢迎的镜像同时带有 OFFICIAL 标记,说明它是官方镜像。用户使用 docker pull 指令下载镜像 `busybox:latest`:
|
||||
|
||||
```bash
|
||||
$ docker pull busybox:latest
|
||||
latest: Pulling from library/busybox
|
||||
5c4213be9af9: Pull complete
|
||||
Digest: sha256:c6b45a95f932202dbb27c31333c4789f45184a744060f6e569cc9d2bf1b9ad6f
|
||||
busybox:latest: The image you are pulling has been verified
|
||||
e433a6c5b276: Pull complete
|
||||
e72ac664f4f0: Pull complete
|
||||
511136ea3c5a: Pull complete
|
||||
df7546f9f060: Pull complete
|
||||
Status: Downloaded newer image for busybox:latest
|
||||
docker.io/library/busybox:latest
|
||||
```
|
||||
|
||||
下载后,可以看到 `busybox` 镜像只有 **2.433 MB**:
|
||||
下载后,可以看到 busybox 镜像只有2.433 MB:
|
||||
|
||||
```bash
|
||||
$ docker image ls
|
||||
@@ -29,9 +44,9 @@ REPOSITORY TAG IMAGE ID CREATED
|
||||
busybox latest e72ac664f4f0 6 weeks ago 2.433 MB
|
||||
```
|
||||
|
||||
## 运行 busybox
|
||||
### 运行 busybox
|
||||
|
||||
启动一个 `busybox` 容器,并在容器中执行 `grep` 命令。
|
||||
启动一个 busybox 容器,并在容器中执行 grep 命令。
|
||||
|
||||
```bash
|
||||
$ docker run -it busybox
|
||||
@@ -70,44 +85,27 @@ Search for PATTERN in FILEs (or stdin)
|
||||
|
||||
```bash
|
||||
/ # mount
|
||||
overlay on / type overlay (rw,relatime,lowerdir=/var/lib/docker/overlay2/l/BOTCI5RF24AMC4A2UWF4N6ZWFP:/var/lib/docker/overlay2/l/TWVP5T5DMKJGXZOROR7CAPWGFP,upperdir=/var/lib/docker/overlay2/801ef0bf6cce35288dbb8fe00a4f9cc47760444693bfdf339ed0bdcf926e12a3/diff,workdir=/var/lib/docker/overlay2/801ef0bf6cce35288dbb8fe00a4f9cc47760444693bfdf339ed0bdcf926e12a3/work)
|
||||
rootfs on / type rootfs (rw)
|
||||
none on / type aufs (rw,relatime,si=b455817946f8505c)
|
||||
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
|
||||
tmpfs on /dev type tmpfs (rw,nosuid,size=65536k,mode=755)
|
||||
tmpfs on /dev type tmpfs (rw,nosuid,mode=755)
|
||||
shm on /dev/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=65536k)
|
||||
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=666)
|
||||
sysfs on /sys type sysfs (ro,nosuid,nodev,noexec,relatime)
|
||||
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,relatime,mode=755)
|
||||
cgroup on /sys/fs/cgroup/systemd type cgroup (ro,nosuid,nodev,noexec,relatime,xattr,release_agent=/lib/systemd/systemd-cgroups-agent,name=systemd)
|
||||
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (ro,nosuid,nodev,noexec,relatime,net_cls,net_prio)
|
||||
cgroup on /sys/fs/cgroup/freezer type cgroup (ro,nosuid,nodev,noexec,relatime,freezer)
|
||||
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (ro,nosuid,nodev,noexec,relatime,cpu,cpuacct)
|
||||
cgroup on /sys/fs/cgroup/cpuset type cgroup (ro,nosuid,nodev,noexec,relatime,cpuset)
|
||||
cgroup on /sys/fs/cgroup/blkio type cgroup (ro,nosuid,nodev,noexec,relatime,blkio)
|
||||
cgroup on /sys/fs/cgroup/perf_event type cgroup (ro,nosuid,nodev,noexec,relatime,perf_event)
|
||||
cgroup on /sys/fs/cgroup/memory type cgroup (ro,nosuid,nodev,noexec,relatime,memory)
|
||||
cgroup on /sys/fs/cgroup/devices type cgroup (ro,nosuid,nodev,noexec,relatime,devices)
|
||||
cgroup on /sys/fs/cgroup/pids type cgroup (ro,nosuid,nodev,noexec,relatime,pids)
|
||||
mqueue on /dev/mqueue type mqueue (rw,nosuid,nodev,noexec,relatime)
|
||||
shm on /dev/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=65536k)
|
||||
/dev/vda1 on /etc/resolv.conf type ext3 (rw,noatime,data=ordered)
|
||||
/dev/vda1 on /etc/hostname type ext3 (rw,noatime,data=ordered)
|
||||
/dev/vda1 on /etc/hosts type ext3 (rw,noatime,data=ordered)
|
||||
devpts on /dev/console type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=666)
|
||||
proc on /proc/bus type proc (ro,relatime)
|
||||
proc on /proc/fs type proc (ro,relatime)
|
||||
proc on /proc/irq type proc (ro,relatime)
|
||||
proc on /proc/sys type proc (ro,relatime)
|
||||
proc on /proc/sysrq-trigger type proc (ro,relatime)
|
||||
tmpfs on /proc/acpi type tmpfs (ro,relatime)
|
||||
tmpfs on /proc/kcore type tmpfs (rw,nosuid,size=65536k,mode=755)
|
||||
tmpfs on /proc/keys type tmpfs (rw,nosuid,size=65536k,mode=755)
|
||||
tmpfs on /proc/timer_list type tmpfs (rw,nosuid,size=65536k,mode=755)
|
||||
tmpfs on /proc/sched_debug type tmpfs (rw,nosuid,size=65536k,mode=755)
|
||||
tmpfs on /sys/firmware type tmpfs (ro,relatime)
|
||||
/dev/disk/by-uuid/b1f2dba7-d91b-4165-a377-bf1a8bed3f61 on /etc/resolv.conf type ext4 (rw,relatime,errors=remount-ro,data=ordered)
|
||||
/dev/disk/by-uuid/b1f2dba7-d91b-4165-a377-bf1a8bed3f61 on /etc/hostname type ext4 (rw,relatime,errors=remount-ro,data=ordered)
|
||||
/dev/disk/by-uuid/b1f2dba7-d91b-4165-a377-bf1a8bed3f61 on /etc/hosts type ext4 (rw,relatime,errors=remount-ro,data=ordered)
|
||||
devpts on /dev/console type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
|
||||
proc on /proc/sys type proc (ro,nosuid,nodev,noexec,relatime)
|
||||
proc on /proc/sysrq-trigger type proc (ro,nosuid,nodev,noexec,relatime)
|
||||
proc on /proc/irq type proc (ro,nosuid,nodev,noexec,relatime)
|
||||
proc on /proc/bus type proc (ro,nosuid,nodev,noexec,relatime)
|
||||
tmpfs on /proc/kcore type tmpfs (rw,nosuid,mode=755)
|
||||
```
|
||||
|
||||
`busybox` 镜像虽然小巧,但包括了大量常见的 `Linux` 命令,读者可以用它快速熟悉 `Linux` 命令。
|
||||
busybox 镜像虽然小巧,但包括了大量常见的 Linux 命令,读者可以用它快速熟悉 Linux 命令。
|
||||
|
||||
## 相关资源
|
||||
### 相关资源
|
||||
|
||||
* `Busybox` 官网:https://busybox.net/
|
||||
* `Busybox` 官方仓库:https://git.busybox.net/busybox/
|
||||
|
||||
@@ -1,37 +1,57 @@
|
||||
# CentOS/Fedora
|
||||
## CentOS/Fedora
|
||||
|
||||
## CentOS 系统简介
|
||||
### CentOS 系统简介
|
||||
|
||||
`CentOS` 和 `Fedora` 都是基于 `Redhat` 的常见 Linux 分支。`CentOS` 是目前企业级服务器的常用操作系统;`Fedora` 则主要面向个人桌面用户。
|
||||
CentOS 和 Fedora 都是基于 Redhat 的常见 Linux 分支。CentOS 是目前企业级服务器的常用操作系统;Fedora 则主要面向个人桌面用户。
|
||||
|
||||

|
||||

|
||||
|
||||
CentOS(Community Enterprise Operating System,中文意思是:社区企业操作系统),它是基于 `Red Hat Enterprise Linux` 源代码编译而成。由于 `CentOS` 与 `Redhat Linux` 源于相同的代码基础,所以很多成本敏感且需要高稳定性的公司就使用 `CentOS` 来替代商业版 `Red Hat Enterprise Linux`。`CentOS` 自身不包含闭源软件。
|
||||
CentOS(Community Enterprise Operating System,中文意思是:社区企业操作系统),它是基于 Red Hat Enterprise Linux 源代码编译而成。由于 CentOS 与 Redhat Linux 源于相同的代码基础,所以很多成本敏感且需要高稳定性的公司就使用 CentOS 来替代商业版 Red Hat Enterprise Linux。CentOS 自身不包含闭源软件。
|
||||
|
||||
### 使用 CentOS 官方镜像
|
||||
#### 使用 CentOS 官方镜像
|
||||
|
||||
使用 `docker run` 直接运行 `CentOS 7` 镜像,并登录 `bash`。
|
||||
首先使用 `docker search` 命令来搜索标星至少为 25 的 CentOS 相关镜像。
|
||||
|
||||
```bash
|
||||
$ docker run -it centos:7 bash
|
||||
$ docker search -f stars=25 centos
|
||||
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
|
||||
centos The official... 2543 [OK]
|
||||
jdeathe/centos-ssh 27 [OK]
|
||||
```
|
||||
|
||||
使用 docker run 直接运行最新的 CentOS 镜像,并登录 bash。
|
||||
|
||||
```bash
|
||||
$ docker run -it centos bash
|
||||
Unable to find image 'centos:latest' locally
|
||||
latest: Pulling from library/centos
|
||||
3d8673bd162a: Pull complete
|
||||
Digest: sha256:a66ffcb73930584413de83311ca11a4cb4938c9b2521d331026dad970c19adf4
|
||||
Status: Downloaded newer image for centos:latest
|
||||
[root@43eb3b194d48 /]# cat /etc/redhat-release
|
||||
CentOS Linux release 7.9.2009 (Core)
|
||||
CentOS Linux release 7.2.1511 (Core)
|
||||
```
|
||||
|
||||
## Fedora 系统简介
|
||||
### Fedora 系统简介
|
||||
|
||||

|
||||

|
||||
|
||||
`Fedora` 由 `Fedora Project` 社区开发,红帽公司赞助的 `Linux` 发行版。它的目标是创建一套新颖、多功能并且自由和开源的操作系统。`Fedora` 的功能对于用户而言,它是一套功能完备的,可以更新的免费操作系统,而对赞助商 `Red Hat` 而言,它是许多新技术的测试平台。被认为可用的技术最终会加入到 `Red Hat Enterprise Linux` 中。
|
||||
Fedora 由 Fedora Project 社区开发,红帽公司赞助的 Linux 发行版。它的目标是创建一套新颖、多功能并且自由和开源的操作系统。Fedora 的功能对于用户而言,它是一套功能完备的,可以更新的免费操作系统,而对赞助商 Red Hat 而言,它是许多新技术的测试平台。被认为可用的技术最终会加入到 Red Hat Enterprise Linux中。
|
||||
|
||||
### 使用 Fedora 官方镜像
|
||||
#### 使用 Fedora 官方镜像
|
||||
|
||||
使用 `docker run` 命令直接运行 `Fedora` 官方镜像,并登录 `bash`。
|
||||
首先使用 `docker search` 命令来搜索标星至少为 2 的 Fedora 相关镜像,结果如下。
|
||||
|
||||
```bash
|
||||
$ docker search -f stars=2 fedora
|
||||
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
|
||||
fedora Official Docker builds of Fedora 433 [OK]
|
||||
dockingbay/fedora-rust Trusted build of Rust programming language... 3 [OK]
|
||||
gluster/gluster-fedora Official GlusterFS image [ Fedora 21 + Glu... 3 [OK]
|
||||
startx/fedora Simple container used for all startx based... 2 [OK]
|
||||
```
|
||||
|
||||
使用 docker run 命令直接运行 Fedora 官方镜像,并登录 bash。
|
||||
|
||||
```bash
|
||||
$ docker run -it fedora bash
|
||||
@@ -44,7 +64,7 @@ Status: Downloaded newer image for fedora:latest
|
||||
Fedora release 24 (Twenty Four)
|
||||
```
|
||||
|
||||
## 相关资源
|
||||
### 相关资源
|
||||
|
||||
* `Fedora` 官网:https://getfedora.org/
|
||||
* `Fedora` 官方仓库:https://github.com/fedora-infra
|
||||
|
||||
@@ -1,20 +1,32 @@
|
||||
# Debian/Ubuntu
|
||||
## Debian/Ubuntu
|
||||
Debian 和 Ubuntu 都是目前较为流行的 Debian 系的服务器操作系统,十分适合研发场景。Docker Hub 上提供了官方镜像,国内各大容器云服务也基本都提供了相应的支持。
|
||||
|
||||
`Debian` 和 `Ubuntu` 都是目前较为流行的 **Debian 系** 的服务器操作系统,十分适合研发场景。`Docker Hub` 上提供了官方镜像,国内各大容器云服务也基本都提供了相应的支持。
|
||||
### Debian 系统简介
|
||||
|
||||
## Debian 系统简介
|
||||

|
||||
|
||||

|
||||
Debian 是由 GPL 和其他自由软件许可协议授权的自由软件组成的操作系统,由Debian 计划(Debian Project)组织维护。Debian 计划是一个独立的、分散的组织,由 3000 人志愿者组成,接受世界多个非盈利组织的资金支持,Software in the Public Interest 提供支持并持有商标作为保护机构。Debian 以其坚守 Unix 和自由软件的精神,以及其给予用户的众多选择而闻名。现时 Debian 包括了超过 25,000 个软件包并支持 12 个计算机系统结构。
|
||||
|
||||
`Debian` 是由 `GPL` 和其他自由软件许可协议授权的自由软件组成的操作系统,由 **Debian 计划(Debian Project)** 组织维护。**Debian 计划** 是一个独立的、分散的组织,由 `3000` 人志愿者组成,接受世界多个非盈利组织的资金支持,`Software in the Public Interest` 提供支持并持有商标作为保护机构。`Debian` 以其坚守 `Unix` 和自由软件的精神,以及其给予用户的众多选择而闻名。现时 `Debian` 包括了超过 `25,000` 个软件包并支持 `12` 个计算机系统结构。
|
||||
Debian 作为一个大的系统组织框架,其下有多种不同操作系统核心的分支计划,主要为采用 Linux 核心的 Debian GNU/Linux 系统,其他还有采用 GNU Hurd 核心的 Debian GNU/Hurd 系统、采用 FreeBSD 核心的 Debian GNU/kFreeBSD 系统,以及采用 NetBSD 核心的 Debian GNU/NetBSD 系统。甚至还有利用 Debian 的系统架构和工具,采用 OpenSolaris 核心构建而成的 Nexenta OS 系统。在这些 Debian 系统中,以采用 Linux 核心的 Debian GNU/Linux 最为著名。
|
||||
|
||||
`Debian` 作为一个大的系统组织框架,其下有多种不同操作系统核心的分支计划,主要为采用 `Linux` 核心的 `Debian GNU/Linux` 系统,其他还有采用 `GNU Hurd` 核心的 `Debian GNU/Hurd` 系统、采用 `FreeBSD` 核心的 `Debian GNU/kFreeBSD` 系统,以及采用 `NetBSD` 核心的 `Debian GNU/NetBSD` 系统。甚至还有利用 `Debian` 的系统架构和工具,采用 `OpenSolaris` 核心构建而成的 `Nexenta OS` 系统。在这些 `Debian` 系统中,以采用 `Linux` 核心的 `Debian GNU/Linux` 最为著名。
|
||||
众多的 Linux 发行版,例如 Ubuntu、Knoppix 和 Linspire 及 Xandros 等,都基于 Debian GNU/Linux。
|
||||
|
||||
众多的 `Linux` 发行版,例如 `Ubuntu`、`Knoppix` 和 `Linspire` 及 `Xandros` 等,都基于 `Debian GNU/Linux`。
|
||||
#### 使用 Debian 官方镜像
|
||||
|
||||
### 使用 Debian 官方镜像
|
||||
读者可以使用 docker search 搜索 Docker Hub,查找 Debian 镜像:
|
||||
|
||||
官方提供了大家熟知的 `debian` 镜像以及面向科研领域的 `neurodebian` 镜像。可以使用 `docker run` 直接运行 `Debian` 镜像。
|
||||
```bash
|
||||
$ docker search debian
|
||||
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
|
||||
debian Debian is... 1565 [OK]
|
||||
neurodebian NeuroDebian... 26 [OK]
|
||||
armbuild/debian port of debian 8 [OK]
|
||||
...
|
||||
```
|
||||
|
||||
官方提供了大家熟知的 debian 镜像以及面向科研领域的 neurodebian 镜像。
|
||||
|
||||
可以使用 docker run 直接运行 Debian 镜像。
|
||||
|
||||
```bash
|
||||
$ docker run -it debian bash
|
||||
@@ -22,19 +34,38 @@ root@668e178d8d69:/# cat /etc/issue
|
||||
Debian GNU/Linux 8
|
||||
```
|
||||
|
||||
`Debian` 镜像很适合作为基础镜像,构建自定义镜像。
|
||||
Debian 镜像很适合作为基础镜像,构建自定义镜像。
|
||||
|
||||
## Ubuntu 系统简介
|
||||
### Ubuntu 系统简介
|
||||
|
||||

|
||||

|
||||
|
||||
`Ubuntu` 是一个以桌面应用为主的 `GNU/Linux` 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词(官方译名“友帮拓”,另有“吾帮托”、“乌班图”、“有奔头”或“乌斑兔”等译名)。`Ubuntu` 意思是“人性”以及“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。 `Ubuntu` 基于 `Debian` 发行版和 `GNOME/Unity` 桌面环境,与 `Debian` 的不同在于它每 6 个月会发布一个新版本,每 2 年推出一个长期支持 **(Long Term Support,LTS)** 版本,一般支持 3 年时间。
|
||||
Ubuntu 是一个以桌面应用为主的GNU/Linux操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词(官方译名“友帮拓”,另有“吾帮托”、“乌班图”、“有奔头”或“乌斑兔”等译名)。Ubuntu 意思是“人性”以及“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。 Ubuntu 基于 Debian 发行版和 GNOME/Unity 桌面环境,与 Debian 的不同在于它每 6 个月会发布一个新版本,每 2 年推出一个长期支持(Long Term Support,LTS)版本,一般支持 3 年时间。
|
||||
|
||||
### 使用 Ubuntu 官方镜像
|
||||
#### 使用 Ubuntu 官方镜像
|
||||
|
||||
下面以 `ubuntu:18.04` 为例,演示如何使用该镜像安装一些常用软件。
|
||||
Ubuntu 相关的镜像有很多,这里使用 `--filter=stars=10` 参数,只搜索那些被收藏 10 次以上的镜像。
|
||||
|
||||
首先使用 `-ti` 参数启动容器,登录 `bash`,查看 `ubuntu` 的发行版本号。
|
||||
```bash
|
||||
$ docker search --filter=stars=10 ubuntu
|
||||
|
||||
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
|
||||
ubuntu Official Ubuntu base image 840 [OK]
|
||||
dockerfile/ubuntu Trusted automated Ubuntu (http://www.ubunt... 30 [OK]
|
||||
crashsystems/gitlab-docker A trusted, regularly updated build of GitL... 20 [OK]
|
||||
sylvainlasnier/memcached This is a Memcached 1.4.14 docker images b... 16 [OK]
|
||||
ubuntu-upstart Upstart is an event-based replacement for ... 16 [OK]
|
||||
mbentley/ubuntu-django-uwsgi-nginx 16 [OK]
|
||||
clue/ttrss The Tiny Tiny RSS feed reader allows you t... 14 [OK]
|
||||
dockerfile/ubuntu-desktop Trusted automated Ubuntu Desktop (LXDE) (h... 14 [OK]
|
||||
tutum/ubuntu Ubuntu image with SSH access. For the root... 12 [OK]
|
||||
```
|
||||
|
||||
根据搜索出来的结果,读者可以自行选择下载镜像并使用。
|
||||
|
||||
下面以 ubuntu 18.04 为例,演示如何使用该镜像安装一些常用软件。
|
||||
|
||||
首先使用 `-ti` 参数启动容器,登录 bash,查看 ubuntu 的发行版本号。
|
||||
|
||||
```bash
|
||||
$ docker run -ti ubuntu:18.04 /bin/bash
|
||||
@@ -63,60 +94,51 @@ Reading state information... Done
|
||||
E: Unable to locate package curl
|
||||
```
|
||||
|
||||
这并非系统不支持 `apt-get` 命令。Docker 镜像在制作时为了精简清除了 `apt` 仓库信息,因此需要先执行 `apt-get update` 命令来更新仓库信息。更新信息后即可成功通过 `apt-get` 命令来安装软件。
|
||||
这并非系统不支持 `apt-get` 命令。Docker 镜像在制作时为了精简清除了 apt 仓库信息,因此需要先执行 `apt-get update` 命令来更新仓库信息。更新信息后即可成功通过 apt-get 命令来安装软件。
|
||||
|
||||
```bash
|
||||
root@7d93de07bf76:/# apt-get update
|
||||
Get:1 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB]
|
||||
Get:2 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]
|
||||
Get:3 http://security.ubuntu.com/ubuntu bionic-security/multiverse amd64 Packages [7348 B]
|
||||
Get:4 http://security.ubuntu.com/ubuntu bionic-security/universe amd64 Packages [823 kB]
|
||||
Get:5 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]
|
||||
Get:6 http://archive.ubuntu.com/ubuntu bionic-backports InRelease [74.6 kB]
|
||||
Get:7 http://archive.ubuntu.com/ubuntu bionic/universe amd64 Packages [11.3 MB]
|
||||
Get:8 http://security.ubuntu.com/ubuntu bionic-security/restricted amd64 Packages [31.0 kB]
|
||||
Get:9 http://security.ubuntu.com/ubuntu bionic-security/main amd64 Packages [835 kB]
|
||||
Get:10 http://archive.ubuntu.com/ubuntu bionic/restricted amd64 Packages [13.5 kB]
|
||||
Get:11 http://archive.ubuntu.com/ubuntu bionic/main amd64 Packages [1344 kB]
|
||||
Get:12 http://archive.ubuntu.com/ubuntu bionic/multiverse amd64 Packages [186 kB]
|
||||
Get:13 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages [1127 kB]
|
||||
Get:14 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 Packages [1350 kB]
|
||||
Get:15 http://archive.ubuntu.com/ubuntu bionic-updates/multiverse amd64 Packages [11.4 kB]
|
||||
Get:16 http://archive.ubuntu.com/ubuntu bionic-updates/restricted amd64 Packages [44.7 kB]
|
||||
Get:17 http://archive.ubuntu.com/ubuntu bionic-backports/main amd64 Packages [2496 B]
|
||||
Get:18 http://archive.ubuntu.com/ubuntu bionic-backports/universe amd64 Packages [4252 B]
|
||||
Fetched 17.6 MB in 1min 25s (207 kB/s)
|
||||
Reading package lists... Done
|
||||
Ign http://archive.ubuntu.com trusty InRelease
|
||||
Ign http://archive.ubuntu.com trusty-updates InRelease
|
||||
Ign http://archive.ubuntu.com trusty-security InRelease
|
||||
Ign http://archive.ubuntu.com trusty-proposed InRelease
|
||||
Get:1 http://archive.ubuntu.com trusty Release.gpg [933 B]
|
||||
...
|
||||
```
|
||||
|
||||
首先,安装 `curl` 工具。
|
||||
首先,安装 curl 工具。
|
||||
|
||||
```bash
|
||||
root@7d93de07bf76:/# apt-get install curl
|
||||
Reading package lists... Done
|
||||
Building dependency tree
|
||||
Reading state information... Done
|
||||
The following additional packages will be installed:
|
||||
ca-certificates krb5-locales libasn1-8-heimdal libcurl4 libgssapi-krb5-2 libgssapi3-heimdal libhcrypto4-heimdal libheimbase1-heimdal libheimntlm0-heimdal libhx509-5-heimdal
|
||||
libk5crypto3 libkeyutils1 libkrb5-26-heimdal libkrb5-3 libkrb5support0 libldap-2.4-2 libldap-common libnghttp2-14 libpsl5 libroken18-heimdal librtmp1 libsasl2-2 libsasl2-modules libsasl2-modules-db libsqlite3-0 libssl1.1 libwind0-heimdal openssl publicsuffix
|
||||
The following extra packages will be installed:
|
||||
ca-certificates krb5-locales libasn1-8-heimdal libcurl3 libgssapi-krb5-2
|
||||
libgssapi3-heimdal libhcrypto4-heimdal libheimbase1-heimdal
|
||||
libheimntlm0-heimdal libhx509-5-heimdal libidn11 libk5crypto3 libkeyutils1
|
||||
libkrb5-26-heimdal libkrb5-3 libkrb5support0 libldap-2.4-2
|
||||
libroken18-heimdal librtmp0 libsasl2-2 libsasl2-modules libsasl2-modules-db
|
||||
libwind0-heimdal openssl
|
||||
...
|
||||
root@7d93de07bf76:/# curl
|
||||
curl: try 'curl --help' or 'curl --manual' for more information
|
||||
```
|
||||
|
||||
接下来,再安装 `apache` 服务。
|
||||
接下来,再安装 apache 服务。
|
||||
|
||||
```bash
|
||||
root@7d93de07bf76:/# apt-get install -y apache2
|
||||
Reading package lists... Done
|
||||
Building dependency tree
|
||||
Reading state information... Done
|
||||
The following additional packages will be installed:
|
||||
apache2-bin apache2-data apache2-utils file libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap libexpat1 libgdbm-compat4 libgdbm5 libicu60 liblua5.2-0 libmagic-mgc libmagic1 libperl5.26 libxml2 mime-support netbase perl perl-modules-5.26 ssl-cert xz-utils
|
||||
The following extra packages will be installed:
|
||||
apache2-bin apache2-data libapr1 libaprutil1 libaprutil1-dbd-sqlite3
|
||||
libaprutil1-ldap libxml2 sgml-base ssl-cert xml-core
|
||||
...
|
||||
```
|
||||
|
||||
启动这个 `apache` 服务,然后使用 `curl` 来测试本地访问。
|
||||
启动这个 apache 服务,然后使用 curl 来测试本地访问。
|
||||
|
||||
```bash
|
||||
root@7d93de07bf76:/# service apache2 start
|
||||
@@ -128,7 +150,7 @@ root@7d93de07bf76:/# curl 127.0.0.1
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<!--
|
||||
Modified from the Debian original for Ubuntu
|
||||
Last updated: 2016-11-16
|
||||
Last updated: 2014-03-19
|
||||
See: https://launchpad.net/bugs/1288690
|
||||
-->
|
||||
<head>
|
||||
@@ -140,14 +162,14 @@ root@7d93de07bf76:/# curl 127.0.0.1
|
||||
|
||||
配合使用 `-p` 参数对外映射服务端口,可以允许容器外来访问该服务。
|
||||
|
||||
## 相关资源
|
||||
### 相关资源
|
||||
|
||||
* `Debian` 官网:https://www.debian.org/
|
||||
* `Neuro Debian` 官网:http://neuro.debian.net/
|
||||
* `Debian` 官方仓库:https://github.com/Debian
|
||||
* `Debian` 官方镜像:https://hub.docker.com/_/debian/
|
||||
* `Debian` 官方镜像仓库:https://github.com/tianon/docker-brew-debian/
|
||||
* `Ubuntu` 官网:https://ubuntu.com
|
||||
* `Ubuntu` 官网:http://www.ubuntu.org.cn/global
|
||||
* `Ubuntu` 官方仓库:https://github.com/ubuntu
|
||||
* `Ubuntu` 官方镜像:https://hub.docker.com/_/ubuntu/
|
||||
* `Ubuntu` 官方镜像仓库:https://github.com/tianon/docker-brew-ubuntu-core
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
|
||||
本章讲解了典型操作系统镜像的下载和使用。
|
||||
|
||||
除了官方的镜像外,在 `Docker Hub` 上还有许多第三方组织或个人上传的 Docker 镜像。
|
||||
除了官方的镜像外,在 Docker Hub 上还有许多第三方组织或个人上传的 Docker 镜像。
|
||||
|
||||
读者可以根据具体情况来选择。一般来说:
|
||||
|
||||
* 官方镜像体积都比较小,只带有一些基本的组件。 精简的系统有利于安全、稳定和高效的运行,也适合进行个性化定制。
|
||||
* 官方镜像体积都比较小,只带有一些基本的组件。 精简的系统有利于安全、稳定和高效的运行,也适合进行定制化。
|
||||
|
||||
* 出于安全考虑,几乎所有官方制作的镜像都没有安装 SSH 服务,无法通过用户名和密码直接登录到容器中。
|
||||
|
||||
@@ -2,4 +2,4 @@
|
||||
|
||||
Docker 目前已经得到了众多公有云平台的支持,并成为除虚拟机之外的核心云业务。
|
||||
|
||||
除了 AWS、Google、Azure 等,国内的各大公有云厂商,基本上都同时支持了虚拟机服务和基于 Kubernetes 的容器云业务。有的还推出了其他服务,例如 [容器镜像服务](https://cloud.tencent.com/act/cps/redirect?redirect=11588&cps_key=3a5255852d5db99dcd5da4c72f05df61) 让用户在云上享有安全高效的镜像托管、分发等服务。
|
||||
除了 AWS、Google、Azure、Docker 官方云服务等,国内的各大公有云厂商,基本上都同时支持了虚拟机服务和容器服务,甚至还专门推出了容器云业务。
|
||||
@@ -1,10 +1,10 @@
|
||||
# 阿里云
|
||||
## 阿里云
|
||||
|
||||

|
||||

|
||||
|
||||
[阿里云](https://www.aliyun.com?source=5176.11533457&userCode=8lx5zmtu&type=copy) 创立于 2009 年,是中国较早的云计算平台。阿里云致力于提供安全、可靠的计算和数据处理能力。
|
||||
|
||||
[阿里云](https://www.aliyun.com?source=5176.11533457&userCode=8lx5zmtu&type=copy) 的客户群体中,活跃着微博、虎牙、魅族、优酷等一大批明星互联网公司。在天猫双 11 全球狂欢节等极富挑战的应用场景中,阿里云保持着良好的运行纪录。
|
||||
[阿里云](https://www.aliyun.com?source=5176.11533457&userCode=8lx5zmtu&type=copy) 的客户群体中,活跃着微博、知乎、魅族、锤子科技、小咖秀等一大批明星互联网公司。在天猫双 11 全球狂欢节等极富挑战的应用场景中,阿里云保持着良好的运行纪录。
|
||||
|
||||
[阿里云容器服务 Kubernetes 版 ACK](https://www.aliyun.com/product/kubernetes?source=5176.11533457&userCode=8lx5zmtu&type=copy) 提供了高性能、可伸缩的容器应用管理服务,支持在一组云服务器上通过 Docker 容器来进行应用生命周期管理。容器服务极大简化了用户对容器管理集群的搭建工作,无缝整合了阿里云虚拟化、存储、网络和安全能力。容器服务提供了多种应用发布方式和流水线般的持续交付能力,原生支持微服务架构,助力用户无缝上云和跨云管理。
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# 亚马逊云
|
||||
## 亚马逊云
|
||||
|
||||

|
||||

|
||||
|
||||
[AWS](https://www.amazonaws.cn),即 Amazon Web Services,是亚马逊(Amazon)公司的 IaaS 和 PaaS 平台服务。AWS 提供了一整套基础设施和应用程序服务,使用户几乎能够在云中运行一切应用程序:从企业应用程序和大数据项目,到社交游戏和移动应用程序。AWS 面向用户提供包括弹性计算、存储、数据库、应用程序在内的一整套云计算服务,能够帮助企业降低 IT 投入成本和维护成本。
|
||||
|
||||
@@ -8,4 +8,4 @@
|
||||
|
||||
2015 年 AWS 正式发布了 EC2 容器服务(ECS)。ECS 的目的是让 Docker 容器变的更加简单,它提供了一个集群和编排的层,用来控制主机上的容器部署,以及部署之后的集群内的容器的生命周期管理。ECS 是诸如 Docker Swarm、Kubernetes、Mesos 等工具的替代,它们工作在同一个层,除了作为一个服务来提供。这些工具和 ECS 不同的地方在于,前者需要用户自己来部署和管理,而 ECS 是“作为服务”来提供的。
|
||||
|
||||

|
||||

|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# 简介
|
||||
## 简介
|
||||
|
||||
目前与容器相关的云计算主要分为两种类型。
|
||||
|
||||
一种是传统的 IaaS 服务商提供对容器相关的服务,包括镜像下载、容器托管等。
|
||||
|
||||
另一种是直接基于容器技术对外提供容器云服务,所谓 Container as a Service(CaaS)。
|
||||
另一种是直接基于容器技术对外提供容器云服务,所谓 Container as a Service(CaaS)。
|
||||
@@ -1,4 +1,4 @@
|
||||
# 本章小结
|
||||
## 本章小结
|
||||
|
||||
本章介绍了公有云服务对 Docker 的积极支持,以及新出现的容器云平台。
|
||||
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
# 腾讯云
|
||||
## 腾讯云
|
||||
|
||||

|
||||

|
||||
|
||||
[腾讯云](https://cloud.tencent.com/act/cps/redirect?redirect=1040&cps_key=3a5255852d5db99dcd5da4c72f05df61&from=console) 在架构方面经过多年积累,并且有着多年对海量互联网服务的经验。不管是社交、游戏还是其他领域,都有多年的成熟产品来提供产品服务。腾讯在云端完成重要部署,为开发者及企业提供云服务、云数据、云运营等整体一站式服务方案。
|
||||
[腾讯云](https://cloud.tencent.com/redirect.php?redirect=1040&cps_key=3a5255852d5db99dcd5da4c72f05df61&from=console) 在架构方面经过多年积累,并且有着多年对海量互联网服务的经验。不管是社交、游戏还是其他领域,都有多年的成熟产品来提供产品服务。腾讯在云端完成重要部署,为开发者及企业提供云服务、云数据、云运营等整体一站式服务方案。
|
||||
|
||||
具体包括 [云服务器](https://cloud.tencent.com/act/cps/redirect?redirect=1001&cps_key=3a5255852d5db99dcd5da4c72f05df61&from=console)、[云存储](https://cloud.tencent.com/act/cps/redirect?redirect=1020&cps_key=3a5255852d5db99dcd5da4c72f05df61&from=console)、[云数据库](https://cloud.tencent.com/act/cps/redirect?redirect=1003&cps_key=3a5255852d5db99dcd5da4c72f05df61&from=console)、[视频与CDN](https://cloud.tencent.com/act/cps/redirect?redirect=1019&cps_key=3a5255852d5db99dcd5da4c72f05df61&from=console) 和 [域名注册](https://dnspod.cloud.tencent.com) 等基础云服务;腾讯云分析(MTA)、腾讯云推送(信鸽)等腾讯整体大数据能力;以及 QQ互联、QQ 空间、微云、微社区等云端链接社交体系。这些正是腾讯云可以提供给这个行业的差异化优势,造就了可支持各种互联网使用场景的高品质的腾讯云技术平台。
|
||||
具体包括 [云服务器](https://cloud.tencent.com/redirect.php?redirect=1001&cps_key=3a5255852d5db99dcd5da4c72f05df61&from=console)、[云存储](https://cloud.tencent.com/redirect.php?redirect=1020&cps_key=3a5255852d5db99dcd5da4c72f05df61&from=console)、[云数据库](https://cloud.tencent.com/redirect.php?redirect=1003&cps_key=3a5255852d5db99dcd5da4c72f05df61&from=console)、[视频与CDN](https://cloud.tencent.com/redirect.php?redirect=1019&cps_key=3a5255852d5db99dcd5da4c72f05df61&from=console) 和 [域名注册](https://dnspod.cloud.tencent.com) 等基础云服务;腾讯云分析(MTA)、腾讯云推送(信鸽)等腾讯整体大数据能力;以及 QQ互联、QQ 空间、微云、微社区等云端链接社交体系。这些正是腾讯云可以提供给这个行业的差异化优势,造就了可支持各种互联网使用场景的高品质的腾讯云技术平台。
|
||||
|
||||
[腾讯云容器服务 TKE](https://cloud.tencent.com/act/cps/redirect?redirect=10058&cps_key=3a5255852d5db99dcd5da4c72f05df61) 是高度可扩展的高性能容器管理服务,用户可以在托管的云服务器实例集群上轻松运行应用程序。使用该服务,将无需安装、运维、扩展用户的集群管理基础设施,只需进行简单的 API 调用,便可启动和停止 Docker 应用程序,查询集群的完整状态,以及使用各种云服务。用户可以根据用户的资源需求和可用性要求在用户的集群中安排容器的置放,满足业务或应用程序的特定要求。
|
||||
[腾讯云容器服务 TKE](https://cloud.tencent.com/redirect.php?redirect=10058&cps_key=3a5255852d5db99dcd5da4c72f05df61) 是高度可扩展的高性能容器管理服务,用户可以在托管的云服务器实例集群上轻松运行应用程序。使用该服务,将无需安装、运维、扩展用户的集群管理基础设施,只需进行简单的 API 调用,便可启动和停止 Docker 应用程序,查询集群的完整状态,以及使用各种云服务。用户可以根据用户的资源需求和可用性要求在用户的集群中安排容器的置放,满足业务或应用程序的特定要求。
|
||||
|
||||

|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Compose 命令说明
|
||||
## Compose 命令说明
|
||||
|
||||
## 命令对象与格式
|
||||
### 命令对象与格式
|
||||
|
||||
对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令影响。
|
||||
|
||||
@@ -12,19 +12,23 @@
|
||||
docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
|
||||
```
|
||||
|
||||
## 命令选项
|
||||
### 命令选项
|
||||
|
||||
* `-f, --file FILE` 指定使用的 Compose 模板文件,默认为 `docker-compose.yml`,可以多次指定。
|
||||
|
||||
* `-p, --project-name NAME` 指定项目名称,默认将使用所在目录名称作为项目名。
|
||||
|
||||
* `--x-networking` 使用 Docker 的可拔插网络后端特性
|
||||
|
||||
* `--x-network-driver DRIVER` 指定网络后端的驱动,默认为 `bridge`
|
||||
|
||||
* `--verbose` 输出更多调试信息。
|
||||
|
||||
* `-v, --version` 打印版本并退出。
|
||||
|
||||
## 命令使用说明
|
||||
### 命令使用说明
|
||||
|
||||
### `build`
|
||||
#### `build`
|
||||
|
||||
格式为 `docker-compose build [options] [SERVICE...]`。
|
||||
|
||||
@@ -42,27 +46,27 @@ docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
|
||||
|
||||
* `--pull` 始终尝试通过 pull 来获取更新版本的镜像。
|
||||
|
||||
### `config`
|
||||
#### `config`
|
||||
|
||||
验证 Compose 文件格式是否正确,若正确则显示配置,若格式错误显示错误原因。
|
||||
|
||||
### `down`
|
||||
#### `down`
|
||||
|
||||
此命令将会停止 `up` 命令所启动的容器,并移除网络
|
||||
|
||||
### `exec`
|
||||
#### `exec`
|
||||
|
||||
进入指定的容器。
|
||||
|
||||
### `help`
|
||||
#### `help`
|
||||
|
||||
获得一个命令的帮助。
|
||||
|
||||
### `images`
|
||||
#### `images`
|
||||
|
||||
列出 Compose 文件中包含的镜像。
|
||||
|
||||
### `kill`
|
||||
#### `kill`
|
||||
|
||||
格式为 `docker-compose kill [options] [SERVICE...]`。
|
||||
|
||||
@@ -74,7 +78,7 @@ docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
|
||||
$ docker-compose kill -s SIGINT
|
||||
```
|
||||
|
||||
### `logs`
|
||||
#### `logs`
|
||||
|
||||
格式为 `docker-compose logs [options] [SERVICE...]`。
|
||||
|
||||
@@ -82,13 +86,13 @@ $ docker-compose kill -s SIGINT
|
||||
|
||||
该命令在调试问题的时候十分有用。
|
||||
|
||||
### `pause`
|
||||
#### `pause`
|
||||
|
||||
格式为 `docker-compose pause [SERVICE...]`。
|
||||
|
||||
暂停一个服务容器。
|
||||
|
||||
### `port`
|
||||
#### `port`
|
||||
|
||||
格式为 `docker-compose port [options] SERVICE PRIVATE_PORT`。
|
||||
|
||||
@@ -100,7 +104,7 @@ $ docker-compose kill -s SIGINT
|
||||
|
||||
* `--index=index` 如果同一服务存在多个容器,指定命令对象容器的序号(默认为 1)。
|
||||
|
||||
### `ps`
|
||||
#### `ps`
|
||||
|
||||
格式为 `docker-compose ps [options] [SERVICE...]`。
|
||||
|
||||
@@ -110,7 +114,7 @@ $ docker-compose kill -s SIGINT
|
||||
|
||||
* `-q` 只打印容器的 ID 信息。
|
||||
|
||||
### `pull`
|
||||
#### `pull`
|
||||
|
||||
格式为 `docker-compose pull [options] [SERVICE...]`。
|
||||
|
||||
@@ -120,11 +124,11 @@ $ docker-compose kill -s SIGINT
|
||||
|
||||
* `--ignore-pull-failures` 忽略拉取镜像过程中的错误。
|
||||
|
||||
### `push`
|
||||
#### `push`
|
||||
|
||||
推送服务依赖的镜像到 Docker 镜像仓库。
|
||||
|
||||
### `restart`
|
||||
#### `restart`
|
||||
|
||||
格式为 `docker-compose restart [options] [SERVICE...]`。
|
||||
|
||||
@@ -134,7 +138,7 @@ $ docker-compose kill -s SIGINT
|
||||
|
||||
* `-t, --timeout TIMEOUT` 指定重启前停止容器的超时(默认为 10 秒)。
|
||||
|
||||
### `rm`
|
||||
#### `rm`
|
||||
|
||||
格式为 `docker-compose rm [options] [SERVICE...]`。
|
||||
|
||||
@@ -146,7 +150,7 @@ $ docker-compose kill -s SIGINT
|
||||
|
||||
* `-v` 删除容器所挂载的数据卷。
|
||||
|
||||
### `run`
|
||||
#### `run`
|
||||
格式为 `docker-compose run [options] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]`。
|
||||
|
||||
在指定服务上执行一个命令。
|
||||
@@ -199,7 +203,7 @@ $ docker-compose run --no-deps web python manage.py shell
|
||||
|
||||
* `-T` 不分配伪 tty,意味着依赖 tty 的指令将无法运行。
|
||||
|
||||
### `scale`
|
||||
#### `scale`
|
||||
|
||||
格式为 `docker-compose scale [options] [SERVICE=NUM...]`。
|
||||
|
||||
@@ -219,13 +223,13 @@ $ docker-compose scale web=3 db=2
|
||||
|
||||
* `-t, --timeout TIMEOUT` 停止容器时候的超时(默认为 10 秒)。
|
||||
|
||||
### `start`
|
||||
#### `start`
|
||||
|
||||
格式为 `docker-compose start [SERVICE...]`。
|
||||
|
||||
启动已经存在的服务容器。
|
||||
|
||||
### `stop`
|
||||
#### `stop`
|
||||
|
||||
格式为 `docker-compose stop [options] [SERVICE...]`。
|
||||
|
||||
@@ -235,17 +239,17 @@ $ docker-compose scale web=3 db=2
|
||||
|
||||
* `-t, --timeout TIMEOUT` 停止容器时候的超时(默认为 10 秒)。
|
||||
|
||||
### `top`
|
||||
#### `top`
|
||||
|
||||
查看各个服务容器内运行的进程。
|
||||
|
||||
### `unpause`
|
||||
#### `unpause`
|
||||
|
||||
格式为 `docker-compose unpause [SERVICE...]`。
|
||||
|
||||
恢复处于暂停状态中的服务。
|
||||
|
||||
### `up`
|
||||
#### `up`
|
||||
|
||||
格式为 `docker-compose up [options] [SERVICE...]`。
|
||||
|
||||
@@ -279,12 +283,12 @@ $ docker-compose scale web=3 db=2
|
||||
|
||||
* `-t, --timeout TIMEOUT` 停止容器时候的超时(默认为 10 秒)。
|
||||
|
||||
### `version`
|
||||
#### `version`
|
||||
|
||||
格式为 `docker-compose version`。
|
||||
|
||||
打印版本信息。
|
||||
|
||||
## 参考资料
|
||||
### 参考资料
|
||||
|
||||
* [官方文档](https://docs.docker.com/compose/reference/overview/)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Compose 模板文件
|
||||
## Compose 模板文件
|
||||
|
||||
模板文件是使用 `Compose` 的核心,涉及到的指令关键字也比较多。但大家不用担心,这里面大部分指令跟 `docker run` 相关参数的含义都是类似的。
|
||||
|
||||
@@ -22,7 +22,7 @@ services:
|
||||
|
||||
下面分别介绍各个指令的用法。
|
||||
|
||||
## `build`
|
||||
### `build`
|
||||
|
||||
指定 `Dockerfile` 所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。 `Compose` 将会利用它自动构建这个镜像,然后使用这个镜像。
|
||||
|
||||
@@ -62,7 +62,7 @@ build:
|
||||
- corp/web_app:3.14
|
||||
```
|
||||
|
||||
## `cap_add, cap_drop`
|
||||
### `cap_add, cap_drop`
|
||||
|
||||
指定容器的内核能力(capacity)分配。
|
||||
|
||||
@@ -80,7 +80,7 @@ cap_drop:
|
||||
- NET_ADMIN
|
||||
```
|
||||
|
||||
## `command`
|
||||
### `command`
|
||||
|
||||
覆盖容器启动后默认执行的命令。
|
||||
|
||||
@@ -88,11 +88,11 @@ cap_drop:
|
||||
command: echo "hello world"
|
||||
```
|
||||
|
||||
## `configs`
|
||||
### `configs`
|
||||
|
||||
仅用于 `Swarm mode`,详细内容请查看 [`Swarm mode`](../swarm_mode/) 一节。
|
||||
|
||||
## `cgroup_parent`
|
||||
### `cgroup_parent`
|
||||
|
||||
指定父 `cgroup` 组,意味着将继承该组的资源限制。
|
||||
|
||||
@@ -102,7 +102,7 @@ command: echo "hello world"
|
||||
cgroup_parent: cgroups_1
|
||||
```
|
||||
|
||||
## `container_name`
|
||||
### `container_name`
|
||||
|
||||
指定容器名称。默认将会使用 `项目名称_服务名称_序号` 这样的格式。
|
||||
|
||||
@@ -112,11 +112,11 @@ container_name: docker-web-container
|
||||
|
||||
>注意: 指定容器名称后,该服务将无法进行扩展(scale),因为 Docker 不允许多个容器具有相同的名称。
|
||||
|
||||
## `deploy`
|
||||
### `deploy`
|
||||
|
||||
仅用于 `Swarm mode`,详细内容请查看 [`Swarm mode`](../swarm_mode/) 一节
|
||||
|
||||
## `devices`
|
||||
### `devices`
|
||||
|
||||
指定设备映射关系。
|
||||
|
||||
@@ -125,7 +125,7 @@ devices:
|
||||
- "/dev/ttyUSB1:/dev/ttyUSB0"
|
||||
```
|
||||
|
||||
## `depends_on`
|
||||
### `depends_on`
|
||||
|
||||
解决容器的依赖、启动先后的问题。以下例子中会先启动 `redis` `db` 再启动 `web`
|
||||
|
||||
@@ -148,7 +148,7 @@ services:
|
||||
|
||||
>注意:`web` 服务不会等待 `redis` `db` 「完全启动」之后才启动。
|
||||
|
||||
## `dns`
|
||||
### `dns`
|
||||
|
||||
自定义 `DNS` 服务器。可以是一个值,也可以是一个列表。
|
||||
|
||||
@@ -160,7 +160,7 @@ dns:
|
||||
- 114.114.114.114
|
||||
```
|
||||
|
||||
## `dns_search`
|
||||
### `dns_search`
|
||||
|
||||
配置 `DNS` 搜索域。可以是一个值,也可以是一个列表。
|
||||
|
||||
@@ -172,7 +172,7 @@ dns_search:
|
||||
- domain2.example.com
|
||||
```
|
||||
|
||||
## `tmpfs`
|
||||
### `tmpfs`
|
||||
|
||||
挂载一个 tmpfs 文件系统到容器。
|
||||
|
||||
@@ -183,7 +183,7 @@ tmpfs:
|
||||
- /tmp
|
||||
```
|
||||
|
||||
## `env_file`
|
||||
### `env_file`
|
||||
|
||||
从文件中获取环境变量,可以为单独的文件路径或列表。
|
||||
|
||||
@@ -207,7 +207,7 @@ env_file:
|
||||
PROG_ENV=development
|
||||
```
|
||||
|
||||
## `environment`
|
||||
### `environment`
|
||||
|
||||
设置环境变量。你可以使用数组或字典两种格式。
|
||||
|
||||
@@ -229,7 +229,7 @@ environment:
|
||||
y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF
|
||||
```
|
||||
|
||||
## `expose`
|
||||
### `expose`
|
||||
|
||||
暴露端口,但不映射到宿主机,只被连接的服务访问。
|
||||
|
||||
@@ -241,7 +241,7 @@ expose:
|
||||
- "8000"
|
||||
```
|
||||
|
||||
## `external_links`
|
||||
### `external_links`
|
||||
|
||||
>注意:不建议使用该指令。
|
||||
|
||||
@@ -254,7 +254,7 @@ external_links:
|
||||
- project_db_1:postgresql
|
||||
```
|
||||
|
||||
## `extra_hosts`
|
||||
### `extra_hosts`
|
||||
|
||||
类似 Docker 中的 `--add-host` 参数,指定额外的 host 名称映射信息。
|
||||
|
||||
@@ -271,7 +271,7 @@ extra_hosts:
|
||||
52.1.157.61 dockerhub
|
||||
```
|
||||
|
||||
## `healthcheck`
|
||||
### `healthcheck`
|
||||
|
||||
通过命令检查容器是否健康运行。
|
||||
|
||||
@@ -283,7 +283,7 @@ healthcheck:
|
||||
retries: 3
|
||||
```
|
||||
|
||||
## `image`
|
||||
### `image`
|
||||
|
||||
指定为镜像名称或镜像 ID。如果镜像在本地不存在,`Compose` 将会尝试拉取这个镜像。
|
||||
|
||||
@@ -293,7 +293,7 @@ image: orchardup/postgresql
|
||||
image: a4bc65fd
|
||||
```
|
||||
|
||||
## `labels`
|
||||
### `labels`
|
||||
|
||||
为容器添加 Docker 元数据(metadata)信息。例如可以为容器添加辅助说明信息。
|
||||
|
||||
@@ -304,11 +304,11 @@ labels:
|
||||
com.startupteam.release: "rc3 for v1.0"
|
||||
```
|
||||
|
||||
## `links`
|
||||
### `links`
|
||||
|
||||
>注意:不推荐使用该指令。
|
||||
|
||||
## `logging`
|
||||
### `logging`
|
||||
|
||||
配置日志选项。
|
||||
|
||||
@@ -335,7 +335,7 @@ options:
|
||||
max-file: "10"
|
||||
```
|
||||
|
||||
## `network_mode`
|
||||
### `network_mode`
|
||||
|
||||
设置网络模式。使用和 `docker run` 的 `--network` 参数一样的值。
|
||||
|
||||
@@ -347,7 +347,7 @@ network_mode: "service:[service name]"
|
||||
network_mode: "container:[container name/id]"
|
||||
```
|
||||
|
||||
## `networks`
|
||||
### `networks`
|
||||
|
||||
配置容器连接的网络。
|
||||
|
||||
@@ -365,7 +365,7 @@ networks:
|
||||
other-network:
|
||||
```
|
||||
|
||||
## `pid`
|
||||
### `pid`
|
||||
|
||||
跟主机系统共享进程命名空间。打开该选项的容器之间,以及容器和宿主机系统之间可以通过进程 ID 来相互访问和操作。
|
||||
|
||||
@@ -373,7 +373,7 @@ networks:
|
||||
pid: "host"
|
||||
```
|
||||
|
||||
## `ports`
|
||||
### `ports`
|
||||
|
||||
暴露端口信息。
|
||||
|
||||
@@ -389,7 +389,7 @@ ports:
|
||||
|
||||
*注意:当使用 `HOST:CONTAINER` 格式来映射端口时,如果你使用的容器端口小于 60 并且没放到引号里,可能会得到错误结果,因为 `YAML` 会自动解析 `xx:yy` 这种数字格式为 60 进制。为避免出现这种问题,建议数字串都采用引号包括起来的字符串格式。*
|
||||
|
||||
## `secrets`
|
||||
### `secrets`
|
||||
|
||||
存储敏感数据,例如 `mysql` 服务密码。
|
||||
|
||||
@@ -412,7 +412,7 @@ secrets:
|
||||
external: true
|
||||
```
|
||||
|
||||
## `security_opt`
|
||||
### `security_opt`
|
||||
|
||||
指定容器模板标签(label)机制的默认属性(用户、角色、类型、级别等)。例如配置标签的用户名和角色名。
|
||||
|
||||
@@ -422,7 +422,7 @@ security_opt:
|
||||
- label:role:ROLE
|
||||
```
|
||||
|
||||
## `stop_signal`
|
||||
### `stop_signal`
|
||||
|
||||
设置另一个信号来停止容器。在默认情况下使用的是 SIGTERM 停止容器。
|
||||
|
||||
@@ -430,7 +430,7 @@ security_opt:
|
||||
stop_signal: SIGUSR1
|
||||
```
|
||||
|
||||
## `sysctls`
|
||||
### `sysctls`
|
||||
|
||||
配置容器内核参数。
|
||||
|
||||
@@ -444,7 +444,7 @@ sysctls:
|
||||
- net.ipv4.tcp_syncookies=0
|
||||
```
|
||||
|
||||
## `ulimits`
|
||||
### `ulimits`
|
||||
|
||||
指定容器的 ulimits 限制值。
|
||||
|
||||
@@ -458,7 +458,7 @@ sysctls:
|
||||
hard: 40000
|
||||
```
|
||||
|
||||
## `volumes`
|
||||
### `volumes`
|
||||
|
||||
数据卷所挂载路径设置。可以设置为宿主机路径(`HOST:CONTAINER`)或者数据卷名称(`VOLUME:CONTAINER`),并且可以设置访问模式 (`HOST:CONTAINER:ro`)。
|
||||
|
||||
@@ -486,7 +486,7 @@ volumes:
|
||||
mysql_data:
|
||||
```
|
||||
|
||||
## 其它指令
|
||||
### 其它指令
|
||||
|
||||
此外,还有包括 `domainname, entrypoint, hostname, ipc, mac_address, privileged, read_only, shm_size, restart, stdin_open, tty, user, working_dir` 等指令,基本跟 `docker run` 中对应参数的功能一致。
|
||||
|
||||
@@ -546,7 +546,7 @@ stdin_open: true
|
||||
tty: true
|
||||
```
|
||||
|
||||
## 读取变量
|
||||
### 读取变量
|
||||
|
||||
Compose 模板文件支持动态读取主机的系统环境变量和当前目录下的 `.env` 文件中的变量。
|
||||
|
||||
@@ -573,7 +573,6 @@ MONGO_VERSION=3.6
|
||||
|
||||
执行 `docker-compose up` 则会启动一个 `mongo:3.6` 镜像的容器。
|
||||
|
||||
## 参考资料
|
||||
### 参考资料
|
||||
|
||||
* [官方文档](https://docs.docker.com/compose/compose-file/)
|
||||
* [awesome-compose](https://github.com/docker/awesome-compose)
|
||||
|
||||
@@ -3,8 +3,6 @@ services:
|
||||
|
||||
db:
|
||||
image: postgres
|
||||
environment:
|
||||
POSTGRES_PASSWORD: 'postgres'
|
||||
|
||||
web:
|
||||
build: .
|
||||
@@ -13,3 +11,5 @@ services:
|
||||
- .:/code
|
||||
ports:
|
||||
- "8000:8000"
|
||||
links:
|
||||
- db
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# 使用 Django
|
||||
## 使用 Django
|
||||
|
||||
> 本小节内容适合 `Python` 开发人员阅读。
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
第一步,因为应用将要运行在一个满足所有环境依赖的 Docker 容器里面,那么我们可以通过编辑 `Dockerfile` 文件来指定 Docker 容器要安装内容。内容如下:
|
||||
|
||||
```docker
|
||||
```dockerfile
|
||||
FROM python:3
|
||||
ENV PYTHONUNBUFFERED 1
|
||||
RUN mkdir /code
|
||||
@@ -35,8 +35,6 @@ services:
|
||||
|
||||
db:
|
||||
image: postgres
|
||||
environment:
|
||||
POSTGRES_PASSWORD: 'postgres'
|
||||
|
||||
web:
|
||||
build: .
|
||||
@@ -45,6 +43,8 @@ services:
|
||||
- .:/code
|
||||
ports:
|
||||
- "8000:8000"
|
||||
links:
|
||||
- db
|
||||
```
|
||||
|
||||
查看 [`docker-compose.yml` 章节](compose_file.md) 了解更多详细的工作机制。
|
||||
@@ -80,7 +80,6 @@ DATABASES = {
|
||||
'USER': 'postgres',
|
||||
'HOST': 'db',
|
||||
'PORT': 5432,
|
||||
'PASSWORD': 'postgres',
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# 安装与卸载
|
||||
## 安装与卸载
|
||||
|
||||
`Compose` 支持 Linux、macOS、Windows 10 三大平台。
|
||||
|
||||
@@ -9,27 +9,24 @@
|
||||
```bash
|
||||
$ docker-compose --version
|
||||
|
||||
docker-compose version 1.27.4, build 40524192
|
||||
docker-compose version 1.24.1, build 4667896b
|
||||
```
|
||||
|
||||
Linux 系统请使用以下介绍的方法安装。
|
||||
|
||||
## 二进制包
|
||||
### 二进制包
|
||||
|
||||
在 Linux 上的也安装十分简单,从 [官方 GitHub Release](https://github.com/docker/compose/releases) 处直接下载编译好的二进制文件即可。
|
||||
|
||||
例如,在 Linux 64 位系统上直接下载对应的二进制包。
|
||||
|
||||
```bash
|
||||
$ sudo curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
|
||||
|
||||
# 国内用户可以使用以下方式加快下载
|
||||
$ sudo curl -L https://download.fastgit.org/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
|
||||
$ sudo curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
|
||||
|
||||
$ sudo chmod +x /usr/local/bin/docker-compose
|
||||
```
|
||||
|
||||
## PIP 安装
|
||||
### PIP 安装
|
||||
|
||||
*注:* `x86_64` 架构的 Linux 建议按照上边的方法下载二进制包进行安装,如果您计算机的架构是 `ARM` (例如,树莓派),再使用 `pip` 安装。
|
||||
|
||||
@@ -45,18 +42,18 @@ $ sudo pip install -U docker-compose
|
||||
|
||||
```bash
|
||||
Collecting docker-compose
|
||||
Downloading docker-compose-1.27.4.tar.gz (149kB): 149kB downloaded
|
||||
Downloading docker-compose-1.24.1.tar.gz (149kB): 149kB downloaded
|
||||
...
|
||||
Successfully installed docker-compose cached-property requests texttable websocket-client docker-py dockerpty six enum34 backports.ssl-match-hostname ipaddress
|
||||
```
|
||||
|
||||
## bash 补全命令
|
||||
### bash 补全命令
|
||||
|
||||
```bash
|
||||
$ curl -L https://raw.githubusercontent.com/docker/compose/1.27.4/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
|
||||
$ curl -L https://raw.githubusercontent.com/docker/compose/1.24.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
|
||||
```
|
||||
|
||||
## 卸载
|
||||
### 卸载
|
||||
|
||||
如果是二进制包方式安装的,删除二进制文件即可。
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Compose 简介
|
||||
## Compose 简介
|
||||
|
||||
`Compose` 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。从功能上看,跟 `OpenStack` 中的 `Heat` 十分类似。
|
||||
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
# 使用 compose 搭建 LNMP 环境
|
||||
|
||||
本项目的维护者 [khs1994](https://github.com/khs1994) 的开源项目 [khs1994-docker/lnmp](https://github.com/khs1994-docker/lnmp) 使用 Docker Compose 搭建了一套 LNMP 环境,各位开发者可以参考该项目在 Docker 或 Kubernetes 中运行 LNMP。
|
||||
@@ -1,4 +1,4 @@
|
||||
# 使用 Rails
|
||||
## 使用 Rails
|
||||
|
||||
> 本小节内容适合 `Ruby` 开发人员阅读。
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
首先,因为应用将要运行在一个满足所有环境依赖的 Docker 容器里面,那么我们可以通过编辑 `Dockerfile` 文件来指定 Docker 容器要安装内容。内容如下:
|
||||
|
||||
```docker
|
||||
```dockerfile
|
||||
FROM ruby
|
||||
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev
|
||||
RUN mkdir /myapp
|
||||
@@ -45,6 +45,8 @@ services:
|
||||
- .:/myapp
|
||||
ports:
|
||||
- "3000:3000"
|
||||
links:
|
||||
- db
|
||||
```
|
||||
|
||||
所有文件就绪后,我们就可以通过使用 `docker-compose run` 命令生成应用的骨架了。
|
||||
@@ -115,3 +117,5 @@ $ docker-compose run web rake db:create
|
||||
```
|
||||
|
||||
这个 web 应用已经开始在你的 docker 守护进程里面监听着 3000 端口了。
|
||||
|
||||

|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# 使用
|
||||
## 使用
|
||||
|
||||
## 术语
|
||||
### 术语
|
||||
|
||||
首先介绍几个术语。
|
||||
|
||||
@@ -10,13 +10,13 @@
|
||||
|
||||
可见,一个项目可以由多个服务(容器)关联而成,`Compose` 面向项目进行管理。
|
||||
|
||||
## 场景
|
||||
### 场景
|
||||
|
||||
最常见的项目是 web 网站,该项目应该包含 web 应用和缓存。
|
||||
|
||||
下面我们用 `Python` 来建立一个能够记录页面访问次数的 web 网站。
|
||||
|
||||
### web 应用
|
||||
#### web 应用
|
||||
|
||||
新建文件夹,在该目录中编写 `app.py` 文件
|
||||
|
||||
@@ -36,11 +36,11 @@ if __name__ == "__main__":
|
||||
app.run(host="0.0.0.0", debug=True)
|
||||
```
|
||||
|
||||
### Dockerfile
|
||||
#### Dockerfile
|
||||
|
||||
编写 `Dockerfile` 文件,内容为
|
||||
|
||||
```docker
|
||||
```dockerfile
|
||||
FROM python:3.6-alpine
|
||||
ADD . /code
|
||||
WORKDIR /code
|
||||
@@ -48,7 +48,7 @@ RUN pip install redis flask
|
||||
CMD ["python", "app.py"]
|
||||
```
|
||||
|
||||
### docker-compose.yml
|
||||
#### docker-compose.yml
|
||||
|
||||
编写 `docker-compose.yml` 文件,这个是 Compose 使用的主模板文件。
|
||||
|
||||
@@ -65,7 +65,7 @@ services:
|
||||
image: "redis:alpine"
|
||||
```
|
||||
|
||||
### 运行 compose 项目
|
||||
#### 运行 compose 项目
|
||||
|
||||
```bash
|
||||
$ docker-compose up
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
# Compose V2
|
||||
|
||||
目前 Docker 官方用 GO 语言 [重写](https://github.com/docker/compose-cli) 了 Docker Compose,并将其作为了 docker cli 的子命令,称为 `Compose V2`。你可以参照官方文档安装,然后将熟悉的 `docker-compose` 命令替换为 `docker compose`,即可使用 Docker Compose。
|
||||
|
||||
## 官方文档
|
||||
|
||||
* [Compose V2 beta](https://docs.docker.com/compose/cli-command/)
|
||||
@@ -1,14 +1,14 @@
|
||||
# 使用 WordPress
|
||||
## 使用 WordPress
|
||||
|
||||
> 本小节内容适合 `PHP` 开发人员阅读。
|
||||
|
||||
`Compose` 可以很便捷的让 `Wordpress` 运行在一个独立的环境中。
|
||||
|
||||
## 创建空文件夹
|
||||
### 创建空文件夹
|
||||
|
||||
假设新建一个名为 `wordpress` 的文件夹,然后进入这个文件夹。
|
||||
|
||||
## 创建 `docker-compose.yml` 文件
|
||||
### 创建 `docker-compose.yml` 文件
|
||||
|
||||
[`docker-compose.yml`](https://github.com/yeasy/docker_practice/blob/master/compose/demo/wordpress/docker-compose.yml) 文件将开启一个 `wordpress` 服务和一个独立的 `MySQL` 实例:
|
||||
|
||||
@@ -46,6 +46,6 @@ volumes:
|
||||
db_data:
|
||||
```
|
||||
|
||||
## 构建并运行项目
|
||||
### 构建并运行项目
|
||||
|
||||
运行 `docker-compose up -d` Compose 就会拉取镜像再创建我们所需要的镜像,然后启动 `wordpress` 和数据库容器。 接着浏览器访问 `127.0.0.1:8000` 端口就能看到 `WordPress` 安装界面了。
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
# 操作 Docker 容器
|
||||
|
||||
容器是 Docker 又一核心概念。
|
||||
|
||||
简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# 进入容器
|
||||
## 进入容器
|
||||
|
||||
在使用 `-d` 参数时,容器启动后会进入后台。
|
||||
|
||||
某些时候需要进入容器进行操作,包括使用 `docker attach` 命令或 `docker exec` 命令,推荐大家使用 `docker exec` 命令,原因会在下面说明。
|
||||
|
||||
## `attach` 命令
|
||||
### `attach` 命令
|
||||
|
||||
下面示例如何使用 `docker attach` 命令。
|
||||
|
||||
@@ -22,9 +22,9 @@ root@243c32535da7:/#
|
||||
|
||||
*注意:* 如果从这个 stdin 中 exit,会导致容器的停止。
|
||||
|
||||
## `exec` 命令
|
||||
### `exec` 命令
|
||||
|
||||
### `-i` `-t` 参数
|
||||
#### -i -t 参数
|
||||
|
||||
`docker exec` 后边可以跟多个参数,这里主要说明 `-i` `-t` 参数。
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# 后台运行
|
||||
## 后台运行
|
||||
|
||||
更多的时候,需要让 Docker 在后台运行而不是直接把执行命令的结果输出在当前宿主机下。此时,可以通过添加 `-d` 参数来实现。
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# 导出和导入容器
|
||||
## 导出和导入容器
|
||||
|
||||
## 导出容器
|
||||
### 导出容器
|
||||
|
||||
如果要导出本地某个容器,可以使用 `docker export` 命令。
|
||||
```bash
|
||||
@@ -12,7 +12,7 @@ $ docker export 7691a814370e > ubuntu.tar
|
||||
|
||||
这样将导出容器快照到本地文件。
|
||||
|
||||
## 导入容器快照
|
||||
### 导入容器快照
|
||||
|
||||
可以使用 `docker import` 从容器快照文件中再导入为镜像,例如
|
||||
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
# 删除容器
|
||||
## 删除容器
|
||||
|
||||
可以使用 `docker container rm` 来删除一个处于终止状态的容器。例如
|
||||
|
||||
```bash
|
||||
$ docker container rm trusting_newton
|
||||
$ docker container rm trusting_newton
|
||||
trusting_newton
|
||||
```
|
||||
|
||||
如果要删除一个运行中的容器,可以添加 `-f` 参数。Docker 会发送 `SIGKILL` 信号给容器。
|
||||
|
||||
# 清理所有处于终止状态的容器
|
||||
## 清理所有处于终止状态的容器
|
||||
|
||||
用 `docker container ls -a` 命令可以查看所有已经创建的包括终止状态的容器,如果数量太多要一个个删除可能会很麻烦,用下面的命令可以清理掉所有处于终止状态的容器。
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# 启动容器
|
||||
## 启动容器
|
||||
|
||||
启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(`exited`)的容器重新启动。
|
||||
启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(`stopped`)的容器重新启动。
|
||||
|
||||
因为 Docker 的容器实在太轻量级了,很多时候用户都是随时删除和新创建容器。
|
||||
|
||||
## 新建并启动
|
||||
### 新建并启动
|
||||
|
||||
所需要的命令主要为 `docker run`。
|
||||
|
||||
@@ -37,7 +37,7 @@ bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr
|
||||
|
||||
当利用 `docker run` 来创建容器时,Docker 在后台运行的标准操作包括:
|
||||
|
||||
* 检查本地是否存在指定的镜像,不存在就从 [registry](../repository/README.md) 下载
|
||||
* 检查本地是否存在指定的镜像,不存在就从公有仓库下载
|
||||
* 利用镜像创建并启动一个容器
|
||||
* 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
|
||||
* 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
|
||||
@@ -45,9 +45,9 @@ bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr
|
||||
* 执行用户指定的应用程序
|
||||
* 执行完毕后容器被终止
|
||||
|
||||
## 启动已终止容器
|
||||
### 启动已终止容器
|
||||
|
||||
可以利用 `docker container start` 命令,直接将一个已经终止(`exited`)的容器启动运行。
|
||||
可以利用 `docker container start` 命令,直接将一个已经终止的容器启动运行。
|
||||
|
||||
容器的核心为所执行的应用程序,所需要的资源都是应用程序运行所必需的。除此之外,并没有其它的资源。可以在伪终端中利用 `ps` 或 `top` 来查看进程信息。
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# 终止容器
|
||||
## 终止容器
|
||||
|
||||
可以使用 `docker container stop` 来终止一个运行中的容器。
|
||||
|
||||
@@ -9,9 +9,10 @@
|
||||
终止状态的容器可以用 `docker container ls -a` 命令看到。例如
|
||||
|
||||
```bash
|
||||
$ docker container ls -a
|
||||
docker container ls -a
|
||||
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
||||
ba267838cc1b ubuntu:18.04 "/bin/bash" 30 minutes ago Exited (0) About a minute ago trusting_newton
|
||||
98e5efa7d997 training/webapp:latest "python app.py" About an hour ago Exited (0) 34 minutes ago backstabbing_pike
|
||||
```
|
||||
|
||||
处于终止状态的容器,可以通过 `docker container start` 命令来重新启动。
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# Fedora CoreOS
|
||||
# CoreOS
|
||||
|
||||
`CoreOS` 是一个专门为安全和大规模运行容器化工作负载而构建的新 Fedora 版本,它继承了 Fedora Atomic Host 和 CoreOS Container Linux 的优势。
|
||||
CoreOS 的设计是为你提供能够像谷歌一样的大型互联网公司一样的基础设施管理能力来动态扩展和管理的计算能力。
|
||||
|
||||
`CoreOS` 的安装文件和运行依赖非常小,它提供了精简的 Linux 系统。它使用 Linux 容器在更高的抽象层来管理你的服务,而不是通过常规的包管理工具 `yum` 或 `apt` 来安装包。
|
||||
CoreOS 的安装文件和运行依赖非常小,它提供了精简的 Linux 系统。它使用 Linux 容器在更高的抽象层来管理你的服务,而不是通过常规的 YUM 和 APT 来安装包。
|
||||
|
||||
同时,`CoreOS` 几乎可以运行在任何平台:`VirtualBox` `Amazon EC2` `QEMU/KVM` `VMware` `Bare Metal` 和 `OpenStack` 等 。
|
||||
同时,CoreOS 几乎可以运行在任何平台:`VirtualBox`, `Amazon EC2`, `QEMU/KVM`, `VMware` 和 `OpenStack` 等 。
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
variant: fcos
|
||||
version: 1.0.0
|
||||
passwd:
|
||||
users:
|
||||
- name: core
|
||||
ssh_authorized_keys:
|
||||
- ssh-rsa AAAA...
|
||||
@@ -1,52 +0,0 @@
|
||||
# 安装 Fedora CoreOS
|
||||
|
||||
## 下载 ISO
|
||||
|
||||
在 [下载页面](https://getfedora.org/coreos/download/) `Bare Metal & Virtualized` 标签页下载 ISO。
|
||||
|
||||
## 编写 FCC
|
||||
|
||||
FCC 是 Fedora CoreOS Configuration (Fedora CoreOS 配置)的简称。
|
||||
|
||||
```yaml
|
||||
# example.fcc
|
||||
variant: fcos
|
||||
version: 1.0.0
|
||||
passwd:
|
||||
users:
|
||||
- name: core
|
||||
ssh_authorized_keys:
|
||||
- ssh-rsa AAAA...
|
||||
```
|
||||
|
||||
将 `ssh-rsa AAAA...` 替换为自己的 SSH 公钥(位于 `~/.ssh/id_rsa.pub`)。
|
||||
|
||||
## 转换 FCC 为 Ignition
|
||||
|
||||
```bash
|
||||
$ docker run -i --rm quay.io/coreos/fcct:v0.5.0 --pretty --strict < example.fcc > example.ign
|
||||
```
|
||||
|
||||
## 挂载 ISO 启动虚拟机并安装
|
||||
|
||||
> 虚拟机需要分配 3GB 以上内存,否则会无法启动。
|
||||
|
||||
在虚拟机终端执行以下命令安装:
|
||||
|
||||
```bash
|
||||
$ sudo coreos-installer install /dev/sda --ignition-file example.ign
|
||||
```
|
||||
|
||||
安装之后重新启动即可使用。
|
||||
|
||||
## 使用
|
||||
|
||||
```bash
|
||||
$ ssh core@虚拟机IP
|
||||
|
||||
$ docker --version
|
||||
```
|
||||
|
||||
## 参考链接
|
||||
|
||||
* [官方文档](https://docs.fedoraproject.org/en-US/fedora-coreos/bare-metal/)
|
||||
@@ -1,28 +1,31 @@
|
||||
# Fedora CoreOS 介绍
|
||||
# CoreOS 介绍
|
||||
|
||||
[Fedora CoreOS](https://getfedora.org/coreos/) 是一个自动更新的,最小的,整体的,以容器为中心的操作系统,不仅适用于集群,而且可独立运行,并针对运行 Kubernetes 进行了优化。它旨在结合 CoreOS Container Linux 和 Fedora Atomic Host 的优点,将 Container Linux 中的 [Ignition](https://github.com/coreos/ignition) 与 [rpm-ostree](https://github.com/coreos/rpm-ostree) 和 Project Atomic 中的 SELinux 强化等技术相集成。其目标是提供最佳的容器主机,以安全,大规模地运行容器化的工作负载。
|
||||
[CoreOS](https://coreos.com/) 对 Docker 甚至容器技术的发展都带来了巨大的推动作用。其提供了运行现代基础设施的特性,支持大规模服务部署,使得在基于最小化的现代操作系统上构建规模化的计算仓库成为了可能。
|
||||
|
||||
## FCOS 特性
|
||||
# CoreOS 特性
|
||||
|
||||
### 一个最小化操作系统
|
||||
## 一个最小化操作系统
|
||||
|
||||
FCOS 被设计成一个基于容器的最小化的现代操作系统。它比现有的 Linux 安装平均节省 40% 的 RAM(大约 114M )并允许从 PXE 或 iPXE 非常快速的启动。
|
||||
CoreOS 被设计成一个基于容器的最小化的现代操作系统。它比现有的 Linux 安装平均节省 40% 的 RAM(大约 114M )并允许从 PXE 或 iPXE 非常快速的启动。
|
||||
|
||||
### 系统初始化
|
||||
## 无痛更新
|
||||
|
||||
Ignition 是一种配置实用程序,可读取配置文件(JSON 格式)并根据该配置配置 FCOS 系统。可配置的组件包括存储,文件系统,systemd 和用户。
|
||||
利用主动和被动双分区方案来更新 OS,使用分区作为一个单元而不是一个包一个包的更新。这使得每次更新变得快速,可靠,而且很容易回滚。
|
||||
|
||||
Ignition 在系统首次启动期间(在 initramfs 中)仅运行一次。由于 Ignition 在启动过程中的早期运行,因此它可以在用户空间开始启动之前重新对磁盘分区,格式化文件系统,创建用户并写入文件。当 systemd 启动时,systemd 服务已被写入磁盘,从而加快了启动时间。
|
||||
## Docker 容器
|
||||
|
||||
### 自动更新
|
||||
应用作为 Docker 容器运行在 CoreOS 上。容器以包的形式提供最大得灵活性并且可以在几毫秒启动。
|
||||
|
||||
FCOS 使用 rpm-ostree 系统进行事务性升级。无需像 yum 升级那样升级单个软件包,而是 rpm-ostree 将 OS 升级作为一个原子单元进行。新的 OS 部署在升级期间进行,并在下次重新引导时生效。如果升级出现问题,则一次回滚和重新启动会使系统返回到先前的状态。确保了系统升级对群集容量的影响降到最小。
|
||||
## 支持集群
|
||||
|
||||
### 容器工具
|
||||
CoreOS 可以在一个机器上很好地运行,但是它被设计用来搭建集群。
|
||||
|
||||
对于诸如构建,复制和其他管理容器的任务,FCOS 用一组容器工具代替了 **Docker CLI**。**podman CLI** 工具支持许多容器运行时功能,例如运行,启动,停止,列出和删除容器和镜像。**skopeo CLI** 工具可以复制,认证和签名镜像。您还可以使用 **crictl CLI** 工具来处理 CRI-O 容器引擎中的容器和镜像。
|
||||
可以通过 k8s 很容易得使应用容器部署在多台机器上并且通过服务发现把他们连接在一起。
|
||||
|
||||
## 参考文档
|
||||
## 分布式系统工具
|
||||
|
||||
* [官方文档](https://docs.fedoraproject.org/en-US/fedora-coreos/)
|
||||
* [openshift 官方文档](https://docs.openshift.com/container-platform/4.3/architecture/architecture-rhcos.html)
|
||||
内置诸如分布式锁和主选举等原生工具用来构建大规模分布式系统得构建模块。
|
||||
|
||||
## 服务发现
|
||||
|
||||
很容易定位服务在集群的那里运行并当发生变化时进行通知。它是复杂高动态集群必不可少的。
|
||||
|
||||
13
coreos/intro_tools.md
Normal file
13
coreos/intro_tools.md
Normal file
@@ -0,0 +1,13 @@
|
||||
# CoreOS 工具介绍
|
||||
|
||||
`CoreOS` 内置了 `服务发现`,`容器管理` 工具。
|
||||
|
||||
## 服务发现
|
||||
|
||||
`CoreOS` 的第一个重要组件就是使用 `etcd` 来实现的服务发现。在 `CoreOS` 中 `etcd` 默认以 `rkt` 容器方式运行。
|
||||
|
||||
`etcd` 使用方法请查看 [etcd 章节](../etcd/)。
|
||||
|
||||
## 容器管理
|
||||
|
||||
第二个组件就是 `Docker`,它用来运行你的代码和应用。`CoreOS` 内置 `Docker`,具体使用请参考本书其他章节。
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user