docker基础

Docker

一句话:操作系统层面的虚拟化技术, 相比于传统虚拟机,优点多。
基本概念:

  • 镜像(Image) 相当于一个root文件系统
  • 容器(Container) 是镜像的实例,本质是进程
  • 仓库(Repository)

主要分为CE和EE版本
添加内核参数

1
2
3
4
5
6
7
8
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled

$ sudo tee -a /etc/sysctl.conf <<-EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
$ sudo sysctl -p

镜像加速器

1
2
3
4
5
6
7
8
vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://registry.docker-cn.com"
]
}
sudo systemctl daemon-reload
sudo systemctl restart docker

基本命令

1
2
$ docker -v
$ docker info

镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
$ docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
$ docker pull ubuntu
$ docker image ls # 列出下载的镜像 -a 列出中间层镜像 ubuntu 显示特定
$ docker system df # 查看镜像占用的空间
$ docker image ls -f dangling=true # 显示虚悬镜像
$ docker image prune # 删除虚悬镜像
$ docker image rm <ID> # 删除镜像, 先删除容器,再删除镜像
$ docker run -it --rm ubuntu bash # 运行

# 使用Dockerfile定制镜像
$ vim Dockerfile
FROM nginx # scratch 空白镜像
COPY package.json /usr/src/app/
ADD # 高级copy,会自动解压tar,url会自动下载等
CMD echo $HOME
CMD ["nginx", "-g", "daemon off;"] # nginx 以前台形式运行, 容器内没有后台服务的概念
ENTRYPOINT ["curl", "-s", "http://blog.itswcg.com"] # 可以传参
ENTRYPOINT ["docker-entrypoint.sh"] # 指定脚本
ENV NAME WCG # 变量
VOLUME /data # 挂载目录
EXPOSE 80 # 只是声明端口
WORKDIR # 工作目录
USER # 用户
HEALTHCHECK # 健康检查
ONBUILD COPY # 当前镜像构建时不会执行,以当前镜像为基础镜像去构建下一级镜像时才执行
RUN apt update \
&& apt install redis \
&& # 尽量一个命令,最后清除不需要的东西

$ docker build -t nginx:v3 . # 构建镜像, .指定上下文目录
$ .dockerignore 文件
$ docker build <url>

容器

1
2
3
4
5
6
7
8
9
10
11
12
13
$ docker run -it ubuntu /bin/bash  # 启动ubuntu并启动一个终端
# -i 让容器的标准输入保持打开 -t 分配一个伪终端并绑定在容器的标准输出上
$ docker container start/restart
$ docker run -d ubuntu # 后台运行
$ docker container ls
$ docker container logs <container id>
$ docker container stop
$ docker exec -it <container id> bash # 后台进入容器
$ docker export <container id> > ubuntu.tar # 导出容器
$ docker import # 导入容器快照
$ docker container rm # 删除容器 -f 删除一个运行中的容器
$ docker container prune # 清除所有终止的容器
$ docker inspect <container id> # 查看容器信息

访问仓库

1
2
3
4
5
$ docker login/logout
$ docker search
$ docker pull
$ docker tag ubuntu:17.10 itswcg/ubuntu:17.10
$ docker push itswcg/ubuntu:17.10 # push

数据管理

1
2
3
4
5
6
7
8
9
# 数据卷
$ docker volume create my-vol # 创建一个数据卷
$ docker volume ls
$ docker volume inspect my-vol # 查看信息
$ docker run -d -P --name web --mount source=my-vol,target=/webapptraining/webapp python app.py
$ docker volume rm my-vol # 删除
$ docker rm -v # 删除容器的时候删除数据卷
$ docker volume prune # 清理
$ docker run -dit --mount type=bind, source=/root/test.py, target=/root/test.py

网络

1
2
3
4
5
6
7
8
# -p 标记会随机映射49000~49900端口到容器端口
$ docker run -d -p 5000:5000 training/webapp python app.py # 本地=>容器
$ docker port <container id> # 产看端口映射

# 容器互联
$ docker network create -d bridge my-net # 创建新的docker网络
$ docker run -it --rm --name busybox1 --network my-net busyboxsh
$ docker run -it --rm --name busybox2 --network my-net busyboxsh
----------本文完,感谢您的阅读----------