Docker 学习记录(记录中......)
Posted ltppp
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker 学习记录(记录中......)相关的知识,希望对你有一定的参考价值。
概念介绍
使用Docker启动Hello World
常用命令
查看命令清单
直接输入docker或者是docker help 可以查看其所有支持命令的命令清单,如下:
[root@ecs-8fdd-0004 docker]# docker
Usage: docker [OPTIONS] COMMAND
A self-sufficient runtime for containers
Options:
--config string Location of client config files (default "/root/.docker")
-c, --context string Name of the context to use to connect to the daemon (overrides DOCKER_HOST env var and default
context set with "docker context use")
-D, --debug Enable debug mode
-H, --host list Daemon socket(s) to connect to
-l, --log-level string Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info")
--tls Use TLS; implied by --tlsverify
--tlscacert string Trust certs signed only by this CA (default "/root/.docker/ca.pem")
--tlscert string Path to TLS certificate file (default "/root/.docker/cert.pem")
--tlskey string Path to TLS key file (default "/root/.docker/key.pem")
--tlsverify Use TLS and verify the remote
-v, --version Print version information and quit
Management Commands:
builder Manage builds
config Manage Docker configs
container Manage containers
context Manage contexts
engine Manage the docker engine
image Manage images
network Manage networks
node Manage Swarm nodes
plugin Manage plugins
secret Manage Docker secrets
service Manage services
可以看到Docker有很多类型的命令,例如设置docker,管理容器,管理镜像,管理服务等。其中最常用的应该是镜像和容器相关的管理,毕竟是其主要的组件。对于我不熟悉的命令,可以输入docker COMMAND --help
进行查看。
[root@ecs-8fdd-0004 docker]# docker images --help
Usage: docker images [OPTIONS] [REPOSITORY[:TAG]]
List images
Options:
-a, --all Show all images (default hides intermediate images)
--digests Show digests
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print images using a Go template
--no-trunc Don‘t truncate output
-q, --quiet Only show numeric IDs
[root@ecs-8fdd-0004 docker]#
镜像常用命令
- 搜索镜像
docker search name
,例如
[root@ecs-8fdd-0004 docker]# docker search JDK
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
primetoninc/jdk Oracle jdk 1.8, 1.7 18 [OK]
ascdc/jdk8 jdk8 9 [OK]
codenvy/jdk8_maven3_tomcat8 JDK 8, Maven 3, Tomcat 8 9 [OK]
codenvy/jdk7_tomcat7 Dockerfile https://github.com/codenvy/docker… 7
kdvolder/jdk8 7
gmaslowski/jdk Oracle JDK8 6
ringcentral/jdk an alpine Linux image included glibc and Ora… 5
openkbs/jdk-mvn-py3 Java 8 OpenJDK + Maven + Python 3+ pip + no… 4 [OK]
codenvy/jdk7 Dockerfile https://github.com/codenvy/docker… 3
codenvy/jdk7_vnc Dockerfile https://github.com/codenvy/docker… 3
codenvy/jdk7_jetty9 Dockerfile https://github.com/codenvy/docker… 2
codenvy/jdk7_jboss7 Dockerfile https://github.com/codenvy/docker… 2
openkbs/jdk11-mvn-py3 Java JDK 11 + Maven 3 + Python 3 + Gradle 4 2 [OK]
andonescu/jdk-8-node-docker-gcp jdk8 node docker gcp 1
openkbs/jdk-mvn-py Java JDK 8 + Maven 3 + Python 2 1 [OK]
payneteasy/jdk-8 Java 8 for using with gitlab-ci 1 [OK]
wealthsimple/jdk 0
ping2ravi/jdk All Java/JDK Versions 0 [OK]
guligo/jdk-maven-ant Tool stack consisting of Oracle JDK, Maven a… 0 [OK]
dwetzel/jdk-ant JDK8 + ANT 0 [OK]
jdk1/php-redis-modified 0
uquote/jdk8-tomee1.7.3-plume Apache Tomee Plume with Oracle JDK 8 on Cent… 0
infinitenature/jdk JDK Images for all jdks jabba supports 0
king019/jdk jdk 0
ukhydrographicoffice/jdk8-python36 Build image that contains bash, jdk 8 and py… 0
- 拉取镜像
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
[root@ecs-8fdd-0004 docker]# docker pull primetoninc/jdk
Using default tag: latest
latest: Pulling from primetoninc/jdk
af4b0a2388c6: Pull complete
af2266c1252d: Pull complete
f9aa7065ca75: Pull complete
Digest: sha256:b90a1af755127b4b886b5437b6e5e90cec90c44a1b55f345e30a5fa8552a52c0
Status: Downloaded newer image for primetoninc/jdk:latest
docker.io/primetoninc/jdk:latest
- 查看单个镜像
docker images primetoninc/jdk:latest
[root@ecs-8fdd-0004 docker]# docker images primetoninc/jdk:latest
REPOSITORY TAG IMAGE ID CREATED SIZE
primetoninc/jdk latest 4f4be6992080 2 years ago 879MB
- 查看所有镜像
docker images
[root@ecs-8fdd-0004 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 6 months ago 13.3kB
primetoninc/jdk latest 4f4be6992080 2 years ago 879MB
- 镜像拷贝并重命名
docker tag source target
[root@ecs-8fdd-0004 ~]# docker tag hello-world hello-word22
[root@ecs-8fdd-0004 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-word22 latest bf756fb1ae65 6 months ago 13.3kB
hello-world latest bf756fb1ae65 6 months ago 13.3kB
primetoninc/jdk latest 4f4be6992080 2 years ago 879MB
- 基于Dockerfile创建一个新的镜像,利用build命令
- 删除镜像
docker rmi
删除镜像前需要先删除使用其的容器
[root@ecs-8fdd-0004 ~]# docker rmi primetoninc/jdk
Untagged: primetoninc/jdk:latest
Untagged: primetoninc/jdk@sha256:b90a1af755127b4b886b5437b6e5e90cec90c44a1b55f345e30a5fa8552a52c0
Deleted: sha256:4f4be6992080a9ec11b730d36ead7a70fd91e40a25e8168cdc1f68f1a7999418
Deleted: sha256:8ff53ceaec631a00a4fb629b693f67b1bd37f59bdd67fb2118356c78991becb0
Deleted: sha256:fa558ae75f601fc7ac6924bbb33bde0c4aa7e0e95d63e4b369e8601dd12464b8
Deleted: sha256:e15afa4858b655f8a5da4c4a41e05b908229f6fab8543434db79207478511ff7
[root@ecs-8fdd-0004 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 6 months ago 13.3kB
hello-word22 latest bf756fb1ae65 6 months ago 13.3kB
容器常用命令
- 运行容器
docker run
,详细使用如下
-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-p: 端口映射,格式为:主机(宿主)端口:容器端口
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
--name="nginx-lb": 为容器指定一个名称;
--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
-h "mars": 指定容器的hostname;
-e username="ritchie": 设置环境变量;
--env-file=[]: 从指定文件读入环境变量;
--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
-m :设置容器使用内存最大值;
--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
--link=[]: 添加链接到另一个容器;
--expose=[]: 开放一个端口或一组端口;
- 查看容器列表
docker ps
,可以查看当前运行的容器,如果要查看所有容器加入==-a==
[root@ecs-8fdd-0004 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
38b7be14b0b3 hello-world "/hello" 8 seconds ago Exited (0) 7 seconds ago elegant_cray
b5baab91d558 hello-world "/hello" 26 hours ago Exited (0) 26 hours ago elastic_lewin
[root@ecs-8fdd-0004 ~]#
- 停止容器
docker stop 容器ID
- 启动容器
docker start 容器ID
- 重启容器
docker restart 容器ID
- 强制停止容器
docker kill 容器ID
- 删除容器
docker rm 容器ID
- 进入容器
docker exec -it 容器ID 参数
- 在容器中创建一个镜像。
# 在制作一些私有镜像时,常常是依赖于一个基础镜像后,然后进入容器中进行相关系统环境的配置,或者相应的优化。但若容器一删除,之前的修改都会没有了。故在这些场景下,可直接从修改后的容器中创建一个自己的私有镜像,这样里面的一些环境和相关优化项还是保留的。
# docker commit [options] 容器id name:tag
docker commit 3ba5b7475423 lqdev.cn/redis:1
参数说明:
-a:提交的镜像作者
-c:使用Dockerfile指令来创建镜像
-m:提交时的说明文字
-p:在commit时,将容器暂停
其他常用命令
- 查看日志
docker logs [OPTIONS] 容器ID
# docker logs [OPTIONS] 容器ID
docker logs -f 3ba5b7475423
参数说明:
-f : 跟踪日志输出
--since :显示某个开始时间的所有日志
-t : 显示时间戳
--tail :仅列出最新N条容器日志
- 宿主和容器之间相互拷贝文件
docker cp
# docker cp 容器名:要拷贝的文件在容器里面的路径 要拷贝到宿主机的相应路径
# docker cp 要拷贝的文件路径 容器名:要拷贝到容器里面对应的路径
docker cp 3ba5b7475423:/opt/a.json /opt
docker cp /opt/a.json 3ba5b7475423:/opt
Dockerfile的简单介绍
简单理解
通过之前的知识,我们知道Docker可以很容易的拉取镜像,环境等。但是在实际开发中,我们打包会有一系列的配置,还会对各种环境进行优化等等。这时候就需要DockerFile了,使用dockerfile文件我们可以自定义镜像的一些东西。可以理解为一个shell脚本的作用。
介绍
Dockerfile是一个文本文件,里面包含了若干条指令,每条指令描述了构建镜像的细节。简单来说,它就是由一系列指令和参数构成的脚本文件,从而构建出一个新的镜像文件。
例子
这里用Nginx来举例,完成从搜索镜像到最后使用Dockerfile启动镜像这一系列流程来帮助理解。
- 搜索镜像
[root@ecs-8fdd-0004 Dockerfile]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 13454 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 1837 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 780 [OK]
linuxserver/nginx An Nginx container, brought to you by LinuxS… 119
bitnami/nginx Bitnami nginx Docker Image 87 [OK]
tiangolo/nginx-rtmp Docker image with Nginx using the nginx-rtmp… 81 [OK]
alfg/nginx-rtmp NGINX, nginx-rtmp-module and FFmpeg from sou… 70 [OK]
jc21/nginx-proxy-manager Docker container for managing Nginx proxy ho… 69
nginxdemos/hello NGINX webserver that serves a simple page co… 56 [OK]
jlesage/nginx-proxy-manager Docker container for Nginx Proxy Manager 50 [OK]
nginx/nginx-ingress NGINX Ingress Controller for Kubernetes 37
privatebin/nginx-fpm-alpine PrivateBin running on an Nginx, php-fpm & Al… 29 [OK]
schmunk42/nginx-redirect A very simple container to redirect HTTP tra… 18 [OK]
nginxinc/nginx-unprivileged Unprivileged NGINX Dockerfiles 16
nginx/nginx-prometheus-exporter NGINX Prometheus Exporter 13
centos/nginx-112-centos7 Platform for running nginx 1.12 or building … 13
raulr/nginx-wordpress Nginx front-end for the official wordpress:f… 13 [OK]
centos/nginx-18-centos7 Platform for running nginx 1.8 or building n… 13
mailu/nginx Mailu nginx frontend 7 [OK]
sophos/nginx-vts-exporter Simple server that scrapes Nginx vts stats a… 7 [OK]
bitnami/nginx-ingress-controller Bitnami Docker Image for NGINX Ingress Contr… 6 [OK]
bitwarden/nginx The Bitwarden nginx web server acting as a r… 6
wodby/nginx Generic nginx 1 [OK]
ansibleplaybookbundle/nginx-apb An APB to deploy NGINX 1 [OK]
centos/nginx-110-centos7 Platform for running nginx 1.10 or building … 0
- 拉取镜像,我们直接选择官方的nginx镜像,也就是第一个。
[root@ecs-8fdd-0004 ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
8559a31e96f4: Pull complete
1cf27aa8120b: Pull complete
67d252a8c1e1: Pull complete
9c2b660fcff6: Pull complete
4584011f2cd1: Pull complete
Digest: sha256:a93c8a0b0974c967aebe868a186e5c205f4d3bcb5423a56559f2f9599074bbcd
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
- 查看镜像列表
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 0901fa9da894 13 hours ago 132MB
hello-word22 latest bf756fb1ae65 6 months ago 13.3kB
hello-world latest bf756fb1ae65 6 months ago 13.3kB
- 运行容器,当前nginx只是一个镜像还未运行
# --name 指定容器名
# -d 后台运行
# -p 指定端口,映射服务器8080端口到容器得80端口
[root@ecs-8fdd-0004 ~]# docker run --name some-nginx -d -p 8080:80 nginx
8bc101d06e476986cd453d3ad490d3d20fed0fe9a95232f031255e49ce094a63
- 此时去访问你的IP地址:8080,就可以进入Nginx首页了。
- 查看当前正在运行得容器
[root@ecs-8fdd-0004 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ee9f9965a1c1 nginx "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 80/tcp some-nginx
- 这个流程我们并未使用Dockerfile来操作,而是仅仅执行了一个简单得启动。下面使用Docker来启动nginx
- 先停止之前得some-nginx容器并删除
docker stop ee9f9965a1c1
docker rm ee9f9965a1c1
- 按自己习惯,找个文件夹创建Dockerfile文件
[root@ecs-8fdd-0004 Dockerfile]# vi Dockerfile
# FROM 指定基础镜像,即以此镜像作为基础
FROM nginx
# 设置元数据,利用 docker inspect [镜像名称|镜像ID],即可查看。
LABEL author="作者:LtPpp"
LABEL version="版本:v0.1"
LABEL desc="说明:修改nginx首页提示"
# 操作执行,这里直接修改了nginx的html的首页内容,/usr/share/nginx/html
RUN echo ‘Hello,Nginx‘ > /usr/share/nginx/html/index.html
# 启动命令 不写时 会直接使用基础镜像的启动命令 类似 nginx -g daemon off
CMD ["nginx", "-g", "daemon off;"]
- Dockerfile已经编辑好了,现在就是使用其来构建镜像了。
# 指定新镜像名为nginx:text 后面得.代表在当前地址执行
docker build -t nginx:text .
- 执行完成后我们查看镜像列表,可以看到nginx:text镜像
[root@ecs-8fdd-0004 Dockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx text a38fb0183261 2 minutes ago 132MB
nginx latest 0901fa9da894 15 hours ago 132MB
hello-word22 latest bf756fb1ae65 6 months ago 13.3kB
hello-world latest bf756fb1ae65 6 months ago 13.3kB
- 然后我们run 这个镜像
docker run --name some-nginx -d -p 8088:80 nginx:text
- 启动后,重新输入IP:8080 即可看到修改后得nginx首页
Dockerfile常用命令介绍
使用docker inspect命令,可以查看到镜像元数据
Dockerfile主要分为四个部分基础镜像信息、元数据信息、镜像操作指令、启动执行指令。
- FROM 指定基础镜像
#语法:
FROM <image>
FROM <image>:<tag>
FROM <image>:<digest>
- LABEL 镜像元数据
LABEL desc="说明:修改nginx首页提示"
- ENV 设置环境变量
ENV <key> <value>
ENV <key>=<value> ...
- VOLUME 定义匿名卷
VOLUME用于创建挂载点,即向基于所构建镜像创始的容器添加卷:基于所构建镜像创始的容器添加卷
一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
- 卷可以容器间共享和重用
- 容器并不一定要和其它容器共享卷
- 修改卷后会立即生效
- 对卷的修改不会对镜像产生影响
- 卷会一直存在,直到没有任何容器在使用它
VOLUME 让我们可以将源代码、数据或其它内容添加到镜像中,而又不并提交到镜像中,并使我们可以多个容器间共享这些内容。
- COPY 复制文件
COPY <源路径>... <目标路径>
COPY ["<源路径1>",... "<目标路径>"]
- ADD 更高级的复制文件
ADD 指令和 COPY 的格式和性质基本一致。但是在 COPY 基础上增加了一些功能。比如<源路径>可以是一个 URL,这种情况下,Docker 引擎会试图去下载这个链接的文件放到<目标路径>去。
- EXPOSE 设置监听端口,容器运行时会监听该端口
EXPOSE <port> [<port>/<protocol>...]
- ARG 设置构建参数
ARG <name>[=<default value>]
- RUN 执行命令,在镜像的构建过程中执行特定的命令,并生成一个中间镜像
RUN <command>
或者
RUN ["executable", "param1", "param2"]
注意:多行命令不要写多个RUN,原因是Dockerfile中每一个指令都会建立一层.多少个RUN就构建了多少层镜像,会造成镜像的臃肿、多层,不仅仅增加了构件部署的时间,还容易出错。
- CMD 启动时命令,容器启动时要运行的命令,
CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2
- ENTRYPOINT 启动默认命令
ENTRYPOINT 用于给容器配置一个可执行程序。也就是说,每次使用镜像创建容器时,通过 ENTRYPOINT 指定的程序都会被设置为默认程序。ENTRYPOINT 有以下两种形式:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
ENTRYPOINT 与 CMD 非常类似,不同的是通过docker run执行的命令不会覆盖 ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile 中只允许有一个 ENTRYPOINT 命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT 指令。
docker run运行容器时指定的参数都会被传递给ENTRYPOINT,且会覆盖 CMD 命令指定的参数。如,执行docker run image -d时,-d 将被传递给入口点。
也可以通过docker run --entrypoint重写 ENTRYPOINT 入口点。如:可以像下面这样指定一个容器执行程序:
ENTRYPOINT ["nginx"]
可以看到默认启动命令修改为:nginx,执行镜像构建后,我们执行
docker run -p 80:80 -d nginx:text -g "daemon off;"
这时,run命令内的参数 -g "daemon off"将会被传递给ENTRYPOINT,最终执行的启动命令是:nginx -g “deemon off”
- WORKDIR 指定工作目录
WORKDIR /opt/docker/workdir
通过WORKDIR设置工作目录后,Dockerfile 中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。
- USER 指定当前用户
实际上手
开发的微服务介绍:
第一步:微服务docker化
准备一个不依赖其他项的微服务,例如权限服务。我们要把他打包为一个docker镜像并构建为一个容器来启动。
- 首先在根目录编写dockerfile
#我们使用jar包运行,首先需要一个JDK的环境。也就是说基础镜像是JDK
FROM OPENJDK:1.8
- idea经过配置可以直接选择dockerfile,然后执行这个dockerfile就可以看到构建的镜像以及容器了。
将使用python编写的服务,docker化
RUN 命令:在镜像的构建过程中执行特定的命令,因为Python基础镜像不包含thrift包,所以我们需要使用以下命令构建一个新的python镜像
FROM PYTHON:3.6
RUN pip install thrift # 构建过程中执行pip install thrift 安装thrift包
- 执行
docker build -t python-base:latest -f Dockerfile.base .
开始构建新的镜像:python-base - 开始构建python编写的微服务,编写Dockerfile
FROM python-base:latest
COPY message /message #将本地message复制到容器内根目录,名字为message
ENTRYPOINT ["python",".message/message_service.py"]
- 开始构建
docker build -t message-service:latest .
- 运行:docker run -it message-service:latest
依次将所有微服务构建为容器
第二步:微服务通讯
当前问题:docker服务彼此没有通讯,方案
- 直接通讯,通过容器的IP和端口进行通信。(缺点:容器的IP和端口极不稳定,每次重启都可能改变)
- 服务把端口映射出去。然后依赖它的容器去访问主机的IP和端口就行
- 使用docker的link地址,link到一个容器之后,可以直接通过名字去访问他。
解决方案:我们的外部服务,例如mysql,redis这类,使用第二种方式来通讯。对于我们自己开发的微服务,使用第三种方式来通讯。
第三步使用docker compose来描述link关系
- 关闭命令
docker-compose down
- 启动命令
docker-compose up -d
- 单独重启:
docker-compose up -d 服务名
- 过滤
docker ps|grep user
过滤出所有含有user的容器 - 查看日志
docker logs 容器ID
第四步搭建镜像仓库
顾名思义:就是存放镜像的仓库,分为公有仓库和私有仓库。主要区别是网速和安全性的问题。
hup.docker.com 公有仓库
- 需要在dockerhup注册账号
- 登录
- 左上角有个你的ID,然后就可以上传了
- 在服务器上登录
docker login
docker tag zookeeper:3.5 imooc/zookeeper:3.5
打标签dacker push imooc/zookeeper:3.5
dacker pull imooc/zookeeper:3.5
测试是否能拉取- 网页端刷新可看
私有仓库
- docker pull registry:2
- docker run -d -p 5000:5000 registry:2
- docker tag zookeeper:3.5 localhost:5000/zookeeper:3.5
- docker push localhost:5000/zookeeper:3.5
存在的问题:
1.单台服务器 无法保证失败另一台服务器能接替
2.没有一个方便查看的界面。不方便。
生成环境现在普遍使用:harbor
- git搜索harbor 下载安装包
- 解压缩
tar -xvf name
- 进入到解压后的harbor文件夹
cd harbor
- 编辑harbor.cfg
vi harbor.cfg
- 修改一哈hostname:修改为自己想要的域名
./install.sh
第五步服务编排
1.mesos
2.kubernetes
3.docker swarm
Mesos
在你的数据中心上运行程序,就像运行在单个的资源池一样。数据中心:多台服务器的集合
Kubernetes
以上是关于Docker 学习记录(记录中......)的主要内容,如果未能解决你的问题,请参考以下文章
20180503 jq学习记录(jquery操作样式表,时间片,jq对象函数间传递)