Docker常见使用
1、Docker安装
## 下载阿里源repo文件
$ curl -o /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo
$ curl -o /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
$ yum clean all && yum makecache
## yum安装
$ yum install -y docker-ce
## 查看源中可用版本
$ yum list docker-ce --showduplicates | sort -r
## 安装指定版本
##yum install -y docker-ce-18.09.9
## 配置源加速
## https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
mkdir -p /etc/docker
vi /etc/docker/daemon.json
{
"registry-mirrors" : [
"https://8xpk5wnt.mirror.aliyuncs.com",
"https://dockerhub.azk8s.cn",
"https://registry.docker-cn.com",
"https://ot2k4d59.mirror.aliyuncs.com/"
]
}
## 设置开机自启
systemctl enable docker
systemctl daemon-reload
## 启动docker
systemctl start docker
2、Docker指令
## 查看docker信息
docker info
## 设置开机自启
systemctl enable docker
## 启动docker
systemctl start docker
## 重启docker
systemctl restart docker
## 停止docker
systemctl stop docker
## docker-client 查看docker安装后的目录
which docker
## docker daemon 进程监控,查看当前进程的情况
ps aux |grep docker
## 查看运行状态的容器列表
$ docker ps
## 查看全部状态的容器列表
$ docker ps -a
3、Docker核心要素
三大核心要素:镜像(Image)、容器(Container)、仓库(Registry)
镜像(Image)
打包了业务代码及运行环境的包,是静态的文件,不能直接对外提供服务。
容器(Container)
镜像的运行时,可以对外提供服务。本质上讲是利用namespace和cgroup等技术在宿主机中创建的独立的虚拟空间。
仓库(Registry)
- 公有仓库,Docker Hub,阿里,网易…
- 私有仓库,企业内部搭建
- Docker Registry,Docker官方提供的镜像仓库存储服务
- Harbor, 是Docker Registry的更高级封装,它除了提供友好的Web UI界面,角色和用户权限管理,用户操作审计等功能
- 镜像访问地址形式 registry.devops.com/demo/hello:latest,若没有前面的url地址,则默认寻找Docker Hub中的镜像,若没有tag标签,则使用latest作为标签
- 公有的仓库中,一般存在这么几类镜像
- 操作系统基础镜像(centos,ubuntu,suse,alpine)
- 中间件(nginx,redis,mysql,tomcat)
- 语言编译环境(python,java,golang)
- 业务镜像(django-demo…)
4、镜像指令
## 查看所有镜像
docker images
## 拉取镜像 docker pull 镜像名:version
docker pull nginx:alpine
## 导出镜像到文件中
docker save -o nginx-alpine.tar nginx:alpine
## 从文件中加载镜像
docker load -i nginx-alpine.tar
## 删除镜像 docker rmi 镜像id/镜像名:tag(version)
docker rmi nginx:alpine
5、推送本地镜像到镜像仓库中
内部系统
## 打tag
docker tag nginx:alpine localhost:5000/nginx:alpine
## 推送到本地镜像仓库(内部)
docker push localhost:5000/nginx:alpine
外部系统
## tag
docker tag nginx:alpine 192.168.200.128:5000/nginx:alpine
## 推送
docker push 192.168.200.128:5000/nginx:alpine
## 报错信息如下
The push refers to repository [192.168.200.128:5000/nginx]
Get https://192.168.200.128:5000/v2/: http: server gave HTTP response to HTTPS client
## docker默认不允许向http的仓库地址推送,如何做成https的,参考:https://docs.docker.com/registry/deploying/#run-an-externally-accessible-registry
## 我们没有可信证书机构颁发的证书和域名,自签名证书需要在每个节点中拷贝证书文件,比较麻烦,因此我们通过配置daemon的方式,来跳过证书的验证:
cat /etc/docker/daemon.json
{
"registry-mirrors": [
"https://8xpk5wnt.mirror.aliyuncs.com"
],
## 跳过验证
"insecure-registries": [
"192.168.200.128:5000"
]
}
systemctl restart docker
docker push 192.168.200.128:5000/nginx:alpine
6、容器指令
容器运行
## 后台运行
docker run --name nginx -d nginx:alpine
docker run -i -t -d参数区别
Options | Mean |
---|---|
-i | 以交互模式运行容器,通常与 -t 同时使用; |
-t | 为容器重新分配一个伪输入终端,通常与 -i 同时使用; |
-d | 后台运行容器,并返回容器ID; |
实际上,在运行容器的时候,镜像地址后面跟的命令等于是覆盖了原有的容器的CMD命令,因此,执行的这些命令在容器内部就是1号进程,若该进程不存在了,那么容器就会处于退出的状态,比如,宿主机中执行。
docker run -d --name test_echo nginx:alpine echo 1,容器会立马退出。
测试如下:
-d
测试1:docker run -d --name ubuntu1 ubuntu:19.10
测试2:
docker run -d --name=test_redis \
-p 6379:6379 \
-v $PWD/redis/redis.conf:/etc/redis/redis.conf \
-v $PWD/redis/data:/data \
redis:latest echo 1
-i
测试1:docker run -i --name ubuntul2 ubuntu:19.10
输入指令:exit 后观察如下图
-t
测试1:docker run -t --name ubuntul3 ubuntu:19.10
进入容器
docker exec -it <container_id_or_name> /bin/bash
宿主机与容器间数据拷贝
## 拷贝宿主机数据到容器
docker cp /tmp/test.txt nginx:/tmp
## 拷贝容器数据到宿主机
docker cp nginx:/tmp/test.txt ./
容器数据持久化-数据卷
## -v
docker run --name nginx -d -v /opt:/opt -v /var/log:/var/log nginx:alpine
docker run -id \
-p 3306:3306 \
--name=new_mysql \
-v $PWD/mysql5.7/conf:/etc/mysql/conf.d \
-v $PWD/mysql5.7/logs:/logs \
-v $PWD/mysql5.7/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7
查看容器日志
## 查看全部日志
$ docker logs nginx
## 实时查看最新日志
$ docker logs -f nginx
## 从最新的100条开始查看
$ docker logs --tail=100 -f nginx
容器启动、删除
## 停止运行中的容器
$ docker stop nginx
## 启动退出容器
$ docker start nginx
## 删除退出容器
$ docker rm nginx
## 删除运行中的容器
$ docker rm -f nginx
查看容器或者镜像的明细
## 查看容器详细信息,包括容器IP地址等
$ docker inspect nginx
## 查看镜像的明细信息
$ docker inspect nginx:alpine
容器中使用vi指令
apt-get update
## 进行安装
apt-get install vim
7、DockerFile
创建Dockerfile文件
## 告诉docker使用哪一个镜像作为模板,后续命令都以该镜像为基础
FROM ubuntu
## RUN命令会在上面指定的镜像里执行命令
RUN apt-get update && apt install -y nginx
## 告诉docker,启动容器时执行如下命令
CMD ["/usr/sbin/nginx","-g","daemon off;"]
详情可以查看:DockerFile
8、Docker Compose
Compose
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
Compose 使用的三个步骤:
- 使用 Dockerfile 定义应用程序的环境。
- 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
- 最后,执行 docker-compose up 命令来启动并运行整个应用程序。
例子:
Dockerfile
# 设置基础镜像
FROM nginx
# 作者
MAINTAINER torlesse <xxxxx@qq.com>
# 将dist文件中的内容复制到 /usr/share/nginx/html/ 这个目录下面
#COPY dist/ /usr/share/nginx/html/
#COPY nginx.conf /etc/nginx/nginx.conf
RUN echo 'echo nginx init ok!!'
FROM java:8
VOLUME /tmp
ADD authtask-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
EXPOSE 8081
ENTRYPOINT [ "java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar" ]
RUN echo 'echo springboot-project run ok!!'
DockerCompose.yml
version: '3.2'
services:
proxy:
image: nginx
ports:
- 18090:8088
- 8081:8081
privileged: true
volumes:
- /root/torlesse/auth/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
- /root/torlesse/auth/nginx/www:/usr/share/nginx/html
- /root/torlesse/auth/nginx/logs:/var/log/nginx
torlesse:
build: .
image: auth
ports:
- "8086:8081"
详情请查看:DockerCompose