linux docker-compose安装:curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
启动docker
启动docker
systemctl start docker
守护进程重启
sudo systemctl daemon-reload
重启docker服务
systemctl restart docker
重启docker服务
sudo service docker restart
关闭docker
service docker stop
关闭docker
systemctl stop docker
避免输出Sudo
这里把当前用户加入到docker组就可以直接使用命令,而不用每次都加sudo
sudo groupadd docker
改完后需要重新登陆用户
sudo gpasswd -a ${USER} docker
Docker版本
sudo docker --version
当前Docker宿主机的信息
docker info
查看容器内部的进程信息
docker top [container]
Containers
ps
查看正在运行的容器,不加-l则只列出正在运行的container(比如后台任务)
sudo docker ps
查看所有的容器
sudo docker ps -a
run
从指定image里生成一个container并在其中运行一个命令,
-d:在后台运行
–p:映射好内外端口,
--name:在容器时的名称
-v 'pwd':/usr/share/nginx/html :把运行容器的当前目录映射到/usr/share/nginx/html
docker run -d -p 80:80 --name myname -v 'pwd':/usr/share/nginx/html nginx:1.13
进入容器
进入一个已经启动的docker容器
docker exec -it ContainerID bash 这个命令exit退出,容器还在运行
docker attach ContainerID ,exit退出就会导致容器stop;按Ctrl+P+Q则容器还在运行
在容器中运行后台任务,只对正在运行的容器有效。
$ docker exec -d -p [container][cmd]
$ docker exec -d edison touch /home/haha
在容器中运行交付式任务,只对正在运行的容器有效。
$ docker exec -t -i edison /bin/bash
注:在/var/lib/docker中,可以查看Docker Image、Container和Volumes等细节信息。
start
再次运行某个container
docker start [container]
stop
中止后台任务container
docker stop [container]
rm
删除某个container
其中container_id不需要输入完整,只要能保证唯一即可。
运行中的Docker容器是无法删除的,必须先通过docker stop或者docker kill命令停止。
docker rm [container]
docker rm `docker ps -a -q` #删除所有容器,-q表示只返回容器的ID
commit
把容器中的对象转成镜像
docker commit 92 m1
logs
查看某个container的运行日志
docker logs [container]
docker logs -f [container] 类似tailf
inspect
查看container详情
docker inspect [container]
attach
切换到后台任务container, 需要当前容器正常运行
注意:切换到后台任务以后无法用Ctrl-C退出
docker attach [container]
指定名称
为容器指定名称,容器的名称是唯一
$ docker run --name edison -i -t ubuntu /bin/bash
有三种方式可以唯一指代容器
短UUID: 716d3c16dc65(12位)
长UUID:716d3c16dc654230ada14f555faadd036474231dfca0ca44b597574a5c618565(64位)
名称: edison
从容器内拷贝文件到主机上
docker cp 容器id:容器同路径 目的的主机路径
docker cp b7845:/home/test.java /home
Images
pull
通过docker命令下载tutorial镜像
docker pull learn/tutorial
images
查看本地镜像
sudo docker images
run/stop
从镜像中运行/停止一个新实例
sudo docker run/stop containerID
search
搜索Docker Image
docker search tutorial
搜索网址是:index.docker.io [国内无法访问]
其他网址是:https://hub.docker.com/
rmi
删除images
docker rmi [image id]
push
将container保存为一个image
docker push [image_name]
原文出处:https://www.jianshu.com/p/10ed530766af
Dockerfile
部分 | 命令 |
基础镜像信息 | FROM |
维护者信息 | MAINTAINER |
镜像操作指令 | RUN、COPY、ADD、EXPOSE、WORKDIR、ONBUILD、USER、VOLUME等 |
容器启动时执行指令 | CMD、ENTRYPOINT |
FROM # 基础镜像, 一切从这里开始构建
MANTAINER # 镜像是谁写的, 姓名+邮箱
RUN #镜像构建的时候需要运行的命令
ADD # 步骤, tomcat镜像,压缩包! 添加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 暴露端口配置
RUN #运行
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承 DockerFile 这个时候就会运行ONBUILD的指令,触发指令
COPY # 类似ADD,将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量!
简单示例
# 1 编写一个DOckerfile的文件
FROM centos
MAINTAINER
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "---end---"
# 2. 通过这个文件构建镜像
docker build -f dockerfile文件路径 -t
docker build -f mydockerfile -t mycentos:0.1
1 FROM
指定哪种镜像作为新镜像的基础镜像,如:
FROM ubuntu:14.04
2 MAINTAINER
指明该镜像的作者和其电子邮件,如:
MAINTAINER vector4wang "xxxxxxx@qq.com"
3 RUN
在新镜像内部执行的命令,比如安装一些软件、配置一些基础环境,可使用\来换行,如:
RUN echo 'hello docker!' \
> /usr/local/file.txt
也可以使用exec格式RUN ["executable", "param1", "param2"]的命令,如:
RUN ["apt-get","install","-y","nginx"]
要注意的是,executable是命令,后面的param是参数
4 COPY
将主机的文件复制到镜像内,如果目的位置不存在,Docker会自动创建所有需要的目录结构,但是它只是单纯的复制,并不会去做文件提取和解压工作。如:
COPY application.yml /etc/springboot/hello-service/src/resources
注意:需要复制的目录一定要放在Dockerfile文件的同级目录下
原因:
因为构建环境将会上传到Docker守护进程,而复制是在Docker守护进程中进行的。任何位于构建环境之外的东西都是不可用的。COPY指令的目的的位置则必须是容器内部的一个绝对路径。
---《THE DOCKER BOOK》
5 ADD
将主机的文件复制到镜像中,跟COPY一样,限制条件和使用方式都一样,如:
ADD application.yml /etc/springboot/hello-service/src/resources
但是ADD会对压缩文件(tar, gzip, bzip2, etc)做提取和解压操作。
6 EXPOSE
暴露镜像的端口供主机做映射,启动镜像时,使用-P参数来讲镜像端口与宿主机的随机端口做映射。使用方式(可指定多个):
EXPOSE 8080
EXPOSE 8081
...
7 WORKDIR
在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录。如
WORKDIR /usr/local
WORKDIR webservice
RUN echo 'hello docker' > text.txt
...
最终会在/usr/local/webservice/目录下生成text.txt文件
8 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
...
9 USER
指定该镜像以什么样的用户去执行,如:
USER mongo
10 VOLUME
用来向基于镜像创建的容器添加卷。比如你可以将mongodb镜像中存储数据的data文件指定为主机的某个文件。(容器内部建议不要存储任何数据)
如:
VOLUME /data/db /data/configdb
注意:VOLUME 主机目录 容器目录
11 CMD
容器启动时需要执行的命令,如:
CMD /bin/bash
同样可以使用exec语法,如
CMD ["/bin/bash"]
当有多个CMD的时候,只有最后一个生效。
12 ENTRYPOINT
ENTRYPOINT作用和用法和CMD一模一样,区别:
1 CMD的命令会被 docker run 的命令覆盖而ENTRYPOINT不会
2 CMD和ENTRYPOINT都存在时,CMD的指令变成了ENTRYPOINT的参数,并且此CMD提供的参数会被 docker run 后面的命令覆盖
13 build
使用当前目录的 Dockerfile 创建镜像,标签为 runoob/ubuntu:v1。
docker build -t runoob/ubuntu:v1 .
使用URL github.com/creack/docker-firefox 的 Dockerfile 创建镜像。
docker build github.com/creack/docker-firefox
也可以通过 -f Dockerfile 文件的位置:
$ docker build -f /path/to/a/Dockerfile .
在 Docker 守护进程执行 Dockerfile 中的指令前,首先会对 Dockerfile 进行语法检查,有语法错误时会返回:
$ docker build -t test/myapp .
Sending build context to Docker daemon 2.048 kB
Error response from daemon: Unknown instruction: RUNCMD
tar
Docker 本地导入镜像/保存镜像/载入镜像/删除镜像
1.docker导入本地镜像
我们可以把本地的镜像导入,使用docker import 命令。
cat alibaba-rocketmq-3.2.6.tar.gz | docker import - rocketmq:3.2.6(镜像名自己定义)
注意镜像文件必须是tar.gz类型的文件。
2.保存镜像
使用docker save命令,保存镜像到本地。
docker save -o rocketmq.tar rocketmq ##-o:指定保存的镜像的名字;rocketmq.tar:保存到本地的镜像名称;rocketmq:镜像名字
或docker save rocketmq > rocketmq.tar
通过"docker images"查看,然后可以通过ll查看到本地的rocketmq.tar文件
3.载入镜像
使用docker load将本地保存的镜像再次导入docker中
docker load --input rocketmq.tar
或 docker load < rocketmq.tar
4.删除镜像
docker rmi -f image_id ##-f:表示强制删除镜像;image_id:镜像id
镜像命名规则,是系统名+系统版本+服务名+服务版本:代码版本,比如我centos 6.5系统安装了nginx 1.4.7版本,放入代码是2.0版本,那么容器命令规则为centos6.5-nginx-1.4.7:2.0
.
网络
自定义网络
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
运行镜像并连接该网络
docker run -d -p --name tomcat-net-01 --net mynet tomcat
docker run -d -p --name tomcat-net-02 --net mynet tomcat
测试
docker network ls
docker network inspect mynet
docker exec -it tomcat-net-01 ping 192.168.0.3
docker exec -it tomcat-net-01 ping tomcat-net-02
将容器连通指定网络
docker network connect mynet tomcat01
容器数据卷
指定路径挂载
-v 宿主机路径 : 容器内路径 #指定路径挂载
docker run -it -v 主机目录: 容器内目录 -p 主机端口: 容器端口
#将宿主机的/root/test挂载到tomcat的/home目录
docker run -d -p 9999:8080 -v /root/test:/home --name="tomcat01" 1b6b1fe7261e
# 启动起来我们可以使用 docker inspect 容器id
# 查看所有的卷的情况 docker volume ls
# 查看指定的卷的详细信息 docker volume inspect 容器id
具名挂载
-v 卷名:容器内路径 #具名挂载
docker run -d -p 9099:80 -v nginxConfig:/etc/nginx 2622e6cca7eb
匿名挂载
-v 容器内路径 #匿名挂载
docker -run -P -name nginx01 -v /etc/nginx nginx
权限控制
#通过 -v 容器内路径: ro rw 改变读写权限
ro read only
read and write
#一旦设置了容器权限,容器对挂载出来的内容就有限定了!
docker -run -P -name nginx01 -v /etc/nginx:ro nginx
docker -run -P -name nginx01 -v /etc/nginx:rw nginx
ro : 只要看到ro就说明这个路径只能通过宿主机来改变,容器内部无法操作
多个容器共用一个数据卷
docker run -it --name docker03 --volumes-from docker01 镜像id
安装elasticsearch、kibana
以下开始从阿里云拉取镜像docker pull docker.elastic.co/elasticsearch/elasticsearch:7.3.0
创建运行docker run -d --name es2 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" 5acf0e8da90b
docker run --name kibana -d -p 5601:5601 -e ELASTICSEARCH_HOSTS=http://192.168.10.8:9200 kibana:7.3.0