【docker】教程 常用命令 基础使用
2019-02-27 本文已影响0人
植富宝
==1. 概念==
1.1 Docker镜像 - Docker Images
容器运行时的只读模板,操作系统 + 软件运行环境 + 用户程序
class User {
private String username;
private Integer age;
}
1.2 Docker 容器 - Docker Containers
容器包含了某个应用运行所需要的全部环境
User user = new User();
1.3 Docker 仓库 - Docker Registeries
用来保存镜像,有公有和私有仓库,比如Maven的中央仓库和本地私服
[图片上传失败...(image-e74e3-1551267580996)]
1.4 Tips
Docker Images : Java Class
Docker Containers : Java Object
通过类创建对象,通过镜像创建容器
==2. 常见命令==
1.搜索镜像 : docker search rabbitmq:management
2.查看系统镜像 : docker images
3.拉取镜像 : docker pull rabbitmq:management
rabbitmq:management是具体镜像名称(格式 REPOSITORY:TAG)
REPOSITORY : 表示镜像的仓库源
TAG : 镜像的标签
4.运行一个容器 :
docker run -d -p 5672:5672 -p 15672:15672 --name beebee_mq rabbitmq:management
docker run -d -p 6379:6379 --name "xd_redis" 4e8db158f18d
docker run -it beebee-api
docker run -d -p 8088:8088 -itv /software/docker/hadoop1/:/tmp --name hadoop1 id/name
docker run : 运行一个容器
-i : 以交互模式运行容器,通常与 -t 同时使用
-t : 为容器重新分配一个伪输入终端,通常与 -i 同时使用
-v : 给容器挂载存储卷,挂载到容器的某个目录
-d : 后台运行
-p : 端口映射
rabbitmq:management(格式 REPOSITORY:TAG),如果不指定tag,默认使用最新的
4e8db158f18d : IMAGE-ID
--name : 容器名称
5.查看当前运行的容器 : docker ps
6.检查容器内部信息 : docker inspect id/name
7.删除镜像 : docker rmi 镜像名称
-f : 强制删除
8.删除某个容器 : docker rm id/name(容器必须是停止状态)
9.停止某个容器 : docker stop id/name
10.启动某个容器 : docker start id/name
11.查看启动日志 : docker logs -f id/name
12.在容器里面进行操作 : docker exec -it nginx /bin/bash
13.构建镜像 : docker build -t eureka-server .
14.查看所有的容器 : docker ps -a
15.复制Linux到docker-文件 : docker cp nginx.conf my-nginx:/etc/nginx/nginx.conf
16.复制docker到Linux-文件夹 : docker cp my-nginx:/etc/nginx /etc/
==3. 高级命令==
1.查看所有的容器 : docker ps -a
2.进入docker容器 : docker exec -it web-nginx /bin/bash , docker attach web-nginx
3.停止守护式容器 : docker stop web-nginx , docker kill web-nginx
4.查看容器详情 : docker inspect id/name
5.查看容器端口映射 : docker port web-nginx
6.容器IP地址 : docker inspect id/name --> NetworkSettings --> IPAddress
7.查看docker存储位置和驱动 : docker info
8.停止所有的容器 : docker stop $(docker ps -a -q)
9.删除所有未运行的容器 : docker rm $(docker ps -a -q)
10.删除所有未打tag的镜像 : docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
11.删除所有镜像 : docker rmi $(docker images -q)
12.docker network
docker network create : 创建
docker network connect
docker network ls : 列出
docker network rm : 删除
docker network disconnect
docker network inspect
==4. 启动nginx==
1. 启动-映射web文件夹 : docker run -dit -p 80:80 -p 443:443 -v /usr/share/nginx/html:/usr/share/nginx/html —name ng 42b4762643dc
2. 复制docker中nginx配置到Linux : docker cp ng:/etc/nginx /etc
3. 停止docker : docker stop ng
4. 重启docker : docker start ng
5. 启动-映射配置文件夹 : docker run -dit -p 80:80 -p 443:443 -v /usr/share/nginx/html:/usr/share/nginx/html -v /etc/nginx:/etc/nginx —name ng 42b4762643dc
==5. 将项目打包为Docker镜像==
5.1 添加pom依赖
<properties>
<docker.image.prefix>beebee</docker.image.prefix>
</properties>
<build>
<finalName>docker-demo</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.3.6</version>
<configuration>
<repository>${docker.image.prefix}/${project.artifactId}</repository>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
</plugins>
</build>
5.2 根目录,新建Dockerfile
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
5.3 构建镜像
mvn install -DskipTests dockerfile:build
5.4 推送镜像到仓库
登录仓库 : docker login --username=anson.zhifu@gmail.com registry.cn-beijing.aliyuncs.com
镜像打标签 : docker tag [ImageId] registry.cn-beijing.aliyuncs.com/beebee/51taqu:[镜像版本号]
推送镜像 : docker push registry.cn-beijing.aliyuncs.com/beebee/51taqu:[镜像版本号]
拉取镜像 : docker pull registry.cn-beijing.aliyuncs.com/beebee/51taqu:[镜像版本号]
阿里云仓库 : https://cr.console.aliyun.com
==6.Dockerfile==
1-FORM:基于什么镜像,FROM <image>或FROM <image>:<tag>
2-MAINTAINER:维护者信息,MAINTAINER <name>
3-RUN:在基础镜像上执行,搭建环境,RUN <command> 或 RUN ["executable", "param1", "param2"]
4-CMD:启动容器时执行的命令,只能有一条
• CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式;
• CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;
• CMD ["param1","param2"] 提供给 ENTRYPOINT 的默认参数;
5-EXPOSE:容器暴露的端口号,EXPOSE <port> [<port>...]
6-ENV:指定环境变量,会被后续的RUN指令使用,并在容器运行时保持
7-ADD:就是复制文件到容器中,ADD <src> <dest>,<src>:可以是一个本地文件,可以是URL,tar文件会自动解压
8-COPY:单纯的复制本地文件到容器中,COPY <src> <dest>
9-ENTRYPOINT:容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖,只能有一条命令
• ENTRYPOINT ["executable", "param1", "param2"]
• ENTRYPOINT command param1 param2(shell中执行)。
10-VOLUME:创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等,VOLUME ["/data"]
11-USER:容器运行时的用户名,USER daemon
12-WORKDIR:切换目录,为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录
13-ONBUILD:配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令,ONBUILD [INSTRUCTION]
# 1 基础镜像
FROM centos:centos6
# 2 维护者
MAINTAINER anson.zhang
# 3 安装基本命令
RUN yum -y update
RUN yum -y groupinstall "Security Tools"
RUN yum -y groupinstall "Debugging Tools"
RUN yum -y groupinstall "Compatibility libraries"
RUN yum -y groupinstall "Development tools"
RUN yum -y groupinstall "Smart card support"
RUN yum -y groupinstall "Base"
RUN yum -y install openssh-clients
RUN yum -y install openssh-server
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 4 安装jdk
COPY jdk-8u144-linux-x64.tar.gz /usr/local/
WORKDIR /usr/local/
RUN tar -xvf ./jdk-8u144-linux-x64.tar.gz
RUN mv ./jdk1.8.0_144 jdk
# 4 安装hadoop
COPY hadoop-2.6.1.tar.gz /usr/local/
RUN tar -xvf ./hadoop-2.6.1.tar.gz
RUN mv ./hadoop-2.6.1 hadoop
# 5 设置jdk环境变量
ENV PATH /usr/local/jdk/bin:/usr/local/hadoop/bin:$PATH
# 6 设置挂载点,或共享卷
VOLUME ["/usr/local/data"]
# 7 使用root登录Linux
# USER root
# 8 暴露端口
EXPOSE 22 80 8080 8090
# 9 启动时执行的命令
# CMD ["/bin/bash"]
# 映射文件夹,设置静态ip,映射端口,系统时间
# docker run --name hadoop1 --net myIp --ip 172.17.2.1 -itv /software/docker/hadoop1/:/usr/local centos:centos6 /bin/bash
==7. 项目构建部署流程==
1. mvn clean compile install -DskipTests
2. docker build -t ...
3. docker images
4. docker tag ...
5. docker push ...
6. docker pull ...
7. docker images
8. docker ps
9. docker stop ...
10. docker rm ...
11. docker run ...
==8. 常见问题==
8.1 浏览器访问不了docker内的接口
1.docker启动时,docker容器端口要和Java应用端口一致
2.访问时,要用http://localhost,http://127.0.0.1,http://59.110.238.225,https://58taqu.com,不要用http://192.168.1.48
3.排查 : 查看日志,curl,端口开放,防火墙
8.2 配置中心访问出错
[图片上传失败...(image-1c358f-1551267580996)]
所有的微服务中添加以下配置
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
instance:
instance-id: ${spring.cloud.client.ip-address}:${server.port}
prefer-ip-address: true
8.3 注意事项
1.application.yml中的经常变动的变量不要写死,比如用${mysql.address}动态取值,启动命令docker run -it user-service:latest --mysql.address=192.168.1.7
2.写完Dockerfile后,写build.sh,方便以后构建,mvn ... 和 docker build ... 和 docker push ...
8.4 错误
1. 这个错误用此命令:systemctl restart docker
image