基础
#
介绍
基于linux LXC,可以实现虚拟化
优点
低成本、高利用率、充分灵活、动态调度
核心网的最终形态
目录
/var/lib/docker
配置
#
镜象网站
https://hub.docker.com/
阿里云个人仓库
入口: cr.console.aliyun.com
docker login -u 934260428@qq.com registry.cn-qingdao.aliyuncs.com
docker tag java/device:1.0 registry.cn-qingdao.aliyuncs.com/mrs-iot/device:1.0
docker push registry.cn-qingdao.aliyuncs.com/mrs-iot/device:1.0
docker pull registry.cn-qingdao.aliyuncs.com/mrs-iot/device:1.0
/etc/sysconfig/docker
# /etc/init.d/docker.conf
OPTIONS='--selinux-enabled --log-driver=journald --insecure-registry 45.55.56.16:5000 --dns 8.8.8.8'
DOCKER_CERT_PATH=/etc/docker
命令
#
常用系统命令
#
systemctl daemon-reload
systemctl restart docker
docker
#
-h
version
login
docker login -u outrun -p asdf
search mysql # 搜索镜像
pull centos:7 # 下载镜像
centos:latest
outrun11/test:nginx1
image
ls
pull
rm
images centos # 本地镜象列表
rmi centos:latest # 删除镜象
container
run # 新建容器
--user root
--name a
--privileged
--name # 显示名
-t # 伪tty, -i 交互的
-rm=true # 执行完后删除
-v /etc/:/opt/etc/ # 挂载本机/etc到容器/opt/etc, /etc/:/opt/etc/:ro 只读挂载, /etc/ 对外共享/etc
-p 1234:80 # 端口映射本机1234端口到容器80
--volumes-from etc_share # 使用另一个容器对外共享的磁盘
-d # 后台运行
--link redis_server:redis # 连接容器的redis命令
-w /var/node # 当前工作目录
-e NODE_ENV='' # 环境变量
--net=bridge # 网络模式,bridge使用虚拟网桥docker0, host共享主机命名空间, container与已存在的一个容器共享命名空间, none关闭网络功能, overlay
--name nsqd -p 4150:4150 nsqio/nsq /nsqd
# 端口
-it centos /bin/bash
# 启动容器, 执行bash
b15 /bin/echo 'hello'
# 启动容器
-it --rm=true --name=ls-volume -v /etc/:/opt/etc/ centos ls /opt/etc
# 创建共享
-it -p 1337:1337 --name=etc_share -v /etc/ centos mkdir /etc/my_share && /bin/sh -c "while true; do echo hello; sleep 1; done"
# 持续运行
-it --rm=true --volumes-from etc_share --name=ls_etc centos ls /etc
# 使用共享
exec # 已有容器中运行
-i
-t
ls
start 026 # 启动已建立的容器, id可以只输入前几位
cp 026e:/docker/file /local/file
stop 026
restart 026e
attach 026 # 进入容器运行命令行, 可显示日志
kill 026e
prune
ps -a # 容器列表
rm # 移除容器
docker rm docker ps -aq
# 移除所有未运行的容器
rm -f 026
build . # 用当前目录Dockerfile创建新镜像
-t="nginx/test" # target
--no-cache # 不用cache
-f a.dockerfile # 指定文件
tag nginx/test:test1 outrun11/test:nginx1
# 远程docker基站创建repository, 名字test
push outrun11/test:nginx1
logs beae3392
swarm # 一个或多个docker组成
init
node # swarm节点
ls
service # 运行于swarm的服务
create
ls
ps
rm
inspect # 详情
scale # 加减副本
update # 变更属性
logs # 查日志
system
prune # 清理所有container, network, image, cache
network # 网卡
ls
rm
prune # 删除全部未使用
inspect # 详情
create
-d nat # 指定驱动
volume # 卷标, 默认挂载到/var/lib/docker/volumes
create
ls
rm
prune # 删除全部未使用
inspect
stack # 单文件定义多服务
deploy
ls
ps
rm
常用
docker inspect 45370 # 详情
--format "{{.State.Pid}}"
docker login a.com -u outrun -p asdf
docker build -t java/gateway:1.0 .
docker push java/gateway:1.0
docker images|grep none|awk '{print $3}'|xargs docker rmi -f
# 删除none镜像
docker image inspect 4de
docker system prune -a
docker exec -it -u root ef2 /bin/bash
docker run --name gateway --rm -d java/gateway:1.0
docker run -it ubuntu
docker restart ef2
docker logs -f -t ef2
docker status 45370 # 显示资源占用
docker save -o a.tar.gz a
docker load < a.tar.gz
nsenter
#
# 指定pid, 不需ssh进入容器运行shell
docker inspect --format {{.State.Pid}} nginx
nsenter -t4629 -n
场景
#
查看镜像内文件
docker run -it --entrypoint sh nginx:latest
查看/var/lib/docker/overlay2/id文件对应container
docker ps -q | xargs docker inspect --format '{{.State.Pid}}, {{.Id}}, {{.Name}}, {{.GraphDriver.Data.WorkDir}}' | grep bff250
Dockerfile
#
指令
FROM nginx # 基于镜像
MAINTAINER outrun # 指定维护者信息
EXPOSE 80 # 内部服务开启的端口
ENV NODE_ENV test # 环境变量
WORKDIR /src # 指定工作目录
COPY ./bin /data/a # 复制外部文件到内部
VOLUME ["/data/log"] # 创建挂载点
ENTRYPOINT ["/data/a/a"] # 启动命令,只有一个
CMD ["-config", "config.toml"] # docker run 时运行
RUN echo 'test' # build过程中执行的命令
docker-compose
#
docker-compose
-h # 帮助
-f # 指定模板
version
up # 所有模板创建容器
-d # 后台
down # 删除容器、网络、卷、镜像
rm # 删除容器
create # 创建容器
stop # 停止容器
start # 启动容器
restart
pause # 暂停容器
unpause
kill # 强制停止容器
scale # 指定容器个数
ps # 列出所有容器
logs # 查日志
port # 显示容器映射端口
run # 容器中执行命令
exec
config # 查看配置
build # (重)构建容器
pull # 拉依赖镜像
push # 推送镜像
配置
version: '3'
services:
dokuwiki:
restart: always
image: bitnami/dokuwiki:latest
ports:
- 8004:80
environment:
- DOKUWIKI_FULL_NAME=outrun
- DOKUWIKI_EMAIL=934260428@qq.com
- DOKUWIKI_WIKI_NAME=Wiki
- DOKUWIKI_USERNAME=outrun
- DOKUWIKI_PASSWORD=asdfasdf
volumes:
- ./data:/bitnami # 本地:镜像
仓库
#
habor
#
registry
#
htpasswd -Bbn outrun asdf > auth/htpasswd
客户端使用
/etc/docker/daemon.json
{"insecure-registries":["127.0.0.1:5000"]}
sudo systemctl daemon-reload
sudo systemctl restart docker
docker login 127.0.0.1:5000
docker tag java/device:1.0 127.0.0.1:5000/java/device:1.0
docker push 127.0.0.1:5000/java/device:1.0
curl --user outrun:asdf 127.0.0.1:5000/v2/_catalog
# v2表示版本 registry:2
docker pull 127.0.0.1:5000/java/device:1.0
常用API
curl --user outrun:asdf -X GET registry:5000/v2/_catalog
# 列表
curl --user outrun:asdf -X GET registry:5000/v2/ubuntu/tags/list
# tags
curl --user outrun:asdf -X GET registry:5000/v2/ubuntu/manifests/latest
# tag
curl --user outrun:asdf -X GET -v --silent -H "Accept: application/vnd.docker.distribution.manifest.v2+json" registry:5000/v2/ubuntu/manifests/latest 2>&1 | grep Docker-Content-Digest | awk '{print ($3)}'
# digest
curl --user outrun:asdf -X DELETE -v --silent -H "Accept: application/vnd.docker.distribution.manifest.v2+json" registry:5000/v2/ubuntu/manifests/sha256:134c7fe821b9d359490cd009ce7ca322453f4f2d018623f849e580a89a685e5d
# 删除
docker exec -it 4ebff4cdc646 /bin/registry garbage-collect /etc/docker/registry/config.yml
# 删除后, 运行垃圾回收
方案
#
查容器pid
docker container top ea1
docker inspect -f '{{.State.Pid}}' ea1
批量删除镜像
docker rmi $(docker image ls -a |grep jncloud |awk '{print $3}')
进入容器
docker exec -it mysql bash
制作镜像并运行
make
docker build -t search:v1 .
docker images
docker run -p 50088:80 -d search:v1
docker ps -a
docker logs ea1
docker rmi bc8
提交镜像到官方
docker -ps -a
docker login
docker commit d79 outrun11/node_pm2
# 把容器提交为镜像
docker images node_pm2
docker push outrun11/node_pm2
代理
/etc/systemd/system/docker.service.d/http-proxy.conf # 没有时创建
Environment="HTTP_PROXY=http://127.0.0.1:8123"
"HTTPS_PROXY=http://127.0.0.1:8123"
"NO_PROXY=192.168.1.1,localhost"
systemctl daemon-reload
换源
/etc/docker/daemon.json # 没有时创建
{
"registry-mirrors": ["https://nmp74w3y.mirror.aliyuncs.com"]
}
systemctl daemon-reload
systemctl restart docker
登录运行容器
docker exec -it --user root 8ce /bin/sh
工具
#
harbor
企业级register镜像服务器
pipwork
shell写的docker网格配置工具