资源链接:http://www.rpmfind.net/linux/rpm2html/search.php?query=docker
docker inspect CONTAINER_NAME #查看容器所有信息
docker container port CONTAINER_NAME #查看容器端口映射信息
docker logs CONTAINER_NAME #查看启动日志
docker history IMAGE_NAME #查看镜像构建
docker volume COMMAND #管理数据卷
容器启动自动执行~/.bashrc
#内部取得root权限(centos7)
在docker run的时候加上--privileged=true参数,然后在最后面加上/usr/sbin/init。
#指定hostname
--hostname <hostname>
#指定网络,host模式,容器将不会获得一个独立的Network,和宿主机共享网络IP和端口
--network=host
#修改hosts文件
在docker run的时候加上--add-host machine:ip
#修改hosts文件
或在/etc/bashrc文件末尾添加 echo "ip hostname" >> /etc/hosts
#windows添加永久静态路由
route add 10.10.0.0 mask 255.255.255.0 10.0.75.2 IF 接口号
route add 172.17.0.0 mask 255.255.255.0 10.0.75.2 IF 接口号
接口号通过 route -4 print 查看,最左边一列就是接口号
#夸宿主机与容器网路互通添加路由(宿主机IP为10.1.24.*)
主机1:route add -net 172.16.12.0/16 gw 10.1.24.225
主机2:route add -net 172.16.12.0/16 gw 10.1.24.223
如果要添加为永久路由:就在在/etc/rc.local里添加
#php容器中添加pdo_mysql扩展模块
docker-php-ext-install pdo_mysql
#docker删除none标签镜像
docker images|grep none|awk '{print $3 }'|xargs docker rmi
#docker容器指定固定ip
1、创建自定义网络
docker network create --driver bridge --subnet=172.16.12.0/16 --gateway=172.16.1.1 newnet
2、创建容器制定ip
docker run -dit --name test --network=newnet --ip 172.16.12.12 centos
#虚拟机做成docker镜像,先打包根目录(视情况排除不需要的目录)
tar --numeric-owner --exclude=/boot --exclude=/vat/tmp --exclude=/proc --exclude=/sys --exclude=/run --exclude=/tmp --exclude=/dev --hard-dereference -czvf kylin.tar.gz /
#然后
cat kylin.tar.gz |docker import - kylin:v10
#修改已创建容器的端口映射
#(1)修改相对应容器的hostcongfig.json(如果有config.v2.json文件也要修改)
vim /var/lib/docker/containers/[容器hash]/hostconfig.json
#(2)修改PortBinding参数,宿主机8001端口映射到容器80端口示例:
"PortBinding":"{"80/tcp"[{"HostIp":"","HostPort":"8001"}]},"
#(3)重启docker
#docker镜像离线下载与上传
docker save mynginx:latest -o /home/mynginx.tar #保存镜像
docker load -i mynginx.tar #加载镜像
docker system prune #清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像)
docker system prune -a #清理得更加彻底,可以将没有容器使用Docker镜像都删掉
#修改容器默认时区与主机一致
-v /etc/localtime:/etc/localtime #也可以在Dockerfile中指定
#Registry镜像仓库API(也可参考:https://www.cnblogs.com/Tempted/p/7768694.html)
curl http://registry:5000/v2/_catalog #获得当前仓库中的镜像列表
curl http://registry:5000/v2/<name>/tags/list #获取镜像标签
curl -I http://registry:5000/v2/<name>/manifests/<tag> #获得一个镜像的Manifest信息
curl -I -X DELETE http://registry:5000/v2/<name>/manifests/<etag的值> #通过Manifest信息中的etag值删除镜像
# 如果是registry2.3或以上版本,要在获取Manifest信息的接口中拿到etag值
# 必须要加如下参数: -H "Accept: application/vnd.docker.distribution.manifest.v2+json"
# 如果删除镜像的时候返回码是405,表示没有开启删除功能,需要添加环境变量: REGISTRY_STORAGE_DELETE_ENABLED=true
Dockerfile简单介绍
组成部分
| 部分 | 命令 |
|---|---|
| 基础镜像信息 | FROM |
| 维护者信息 | MAINTAINER |
| 镜像操作指令 | RUN,COPY,ADD,EXPOSE,WORKDIR,ONBUILD,VOLUME,USER等 |
| 容器启动时执行指令 | CMD、ENTRYPOINT |
各命令详解
FROM
指定哪种镜像作为新镜像的基础镜像,如:
FROM ubuntu:14.04
MAINTAINER
指明该镜像的作者和其电子邮件,如:
MAINTAINER Zoe.wang "xxxxxxx@qq.com"
RUN
在新镜像内部执行的命令,比如安装一些软件、配置一些基础环境(可使用\来换行)如:
RUN echo 'hello docker!' > /usr/local/file.txt
也可以使用exec格式RUN [“executable”, “param1”, “param2”]的命令,如:
RUN ["apt-get","install","-y","nginx"]
要注意的是,executable是命令,后面的param是参数
COPY
将主机的文件复制到镜像内,如果目的位置不存在,Docker会自动创建所有需要的目录结构,但是它只是单纯的复制,并不会去做文件提取和解压工作。如:
COPY application.yml /etc/springboot/hello-service/src/resource
注意:需要复制的目录一定要放在Dockerfile文件的同级目录下
ADD
将主机的文件复制到镜像中,跟COPY一样,限制条件和使用方式都一样,如:
ADD application.yml /etc/springboot/hello-service/src/resources
EXPOSE
暴露镜像的端口供主机做映射,启动镜像时,使用-P参数来讲镜像端口与宿主机的随机端口做映射。使用方式(可指定多个):
EXPOSE 8080
EXPOSE 8081
...
WORKDIR
在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录。如
WORKDIR /usr/local
WORKDIR webservice
RUN echo 'hello docker' > text.txt
...
最终会在/usr/local/webservice/目录下生成text.txt文件
ONBUILD
当一个包含ONBUILD命令的镜像被用作其他镜像的基础镜像时(比如用户的镜像需要从某为准备好的位置添加源代码,或者用户需要执行特定于构建镜像的环境的构建脚本),该命令就会执行。
如创建镜像image-A
FROM ubuntu
...
ONBUILD ADD . /var/www
...
然后创建镜像image-B,指定image-A为基础镜像,如
FROM image-A
...
然后在构建image-B的时候,日志上显示如下:
Step 0 : FROM image-A
# Execting 1 build triggers
Step onbuild-0 : ADD . /var/www
...
USER
指定该镜像以什么样的用户去执行,如:
USER mongo
VOLUME
用来向基于镜像创建的容器添加卷。比如你可以将mongodb镜像中存储数据的data文件指定为主机的某个文件。(容器内部建议不要存储任何数据)
如:
VOLUME /data/db /data/configdb
注意: VOLUME 主机目录 容器目录
CMD
容器启动时需要执行的命令,如:
CMD /bin/bash
同样可以使用exec语法,如
CMD ["/bin/bash"]
当有多个CMD的时候,只有最后一个生效。
ENTRYPOINT
作用和用法和CMD一模一样
CMD和ENTRYPOINT的区别
敲黑板!!!非常重要
一定要注意!
一定要注意!
一定要注意
CMD的命令会被 docker run 的命令覆盖而ENTRYPOINT不会
CMD和ENTRYPOINT都存在时,CMD的指令变成了ENTRYPOINT的参数,并且此CMD提供的参数会被 docker run 后面的命令覆盖,如:
...
ENTRYPOINT ["echo","hello","i am"]
CMD ["docker"]
之后启动构建之后的容器
docker run -ti image
输出“hello i am docker”
使用docker run -ti image world
输出“hello i am world”
- 创建centos中文镜像
# 基于官方centos7精简版基础镜像,添加中文支持
FROM centos:centos7.4.1708
# 更新软件
RUN yum -y upgrade
# 安装中文包
RUN yum install -y kde-l10n-Chinese
# 重新安装glibc-common
RUN yum -y reinstall glibc-common
# 编译生成语言库
RUN localedef -c -f UTF-8 -i zh_CN zh_CN.utf8
# 设置语言默认值为中文,时区改为东八区
RUN echo 'LANG="zh_CN.UTF-8"' > /etc/locale.conf
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ENV LANG zh_CN.UTF-8
ENV LC_ALL zh_CN.UTF-8
docker-compose用法
- yml示例
version: '2.4'
services:
mysql:
image: mariadb:10.6
container_name: mariadb
restart: always
command: --character-set-server=utf8 --collation-server=utf8_general_ci
environment:
DB_PORT: 3306
MARIADB_ROOT_PASSWORD: nu4x599Wq7u0Bn8EABh3J91G
MARIADB_DATABASE: root
deploy:
resources:
limits:
cpu: '1'
memory: 512M
reservations:
cpu: '0.2'
memory: 256M
healthcheck:
test: "mysql -h127.0.0.1 -P3306 -uroot -pnu4x599Wq7u0Bn8EABh3J91G -e 'SHOW DATABASES;'"
interval: 10s
timeout: 5s
retries: 3
start_period: 30s
volumes:
- /tmp/mariadb/data:/var/lib/mysql
networks:
- default
- 命令
#启动
docker-compose -f docker-compose-mariadb.yml start 或 docker-compose -f docker-compose-mariadb.yml up -d
#重启
docker-compose -f docker-compose-mariadb.yml restart
#停止
docker-compose -f docker-compose-mariadb.yml stop
