Docker要隔离的的6种 nameSpace:
UTS 主机和域名
IPC 信号量、消息队列和共享内容
PID 进程编号
network 网络设备、网络栈、端口等
mount 挂载点(文件系统)
user 用户和用户组
一、注册Docker用户
链接: docker.hub.
二、Docker镜像管理
1、连接docker.hub
命令:
docker login docker.io
2、搜索一个镜像
docker search alpine
3、下载一个镜像
docker pull alpine
也可以指定tag,例:
docker pull alpine:3.10.1
未登录docker.hub和私有仓库的下载方式:
docker pull docker.io/library/alpine:3.13.3
- 镜像的结构:
registry_name/repository_name_image_name:tag_name
- 例如:
docker.io/library/alpine:3.13.3
4、查看本地镜像
docker images
5、给docker打tag(用到了上图的 IMAGE ID 和镜像结构)
docker tag 302aba9ce190 docker.io/albatross7/alpine:v3.13.3
6、推送镜像
docker push docker.io/albatross7/alpine:v3.13.3
7、查看本地有多少个alpine
docker images | grep alpine
8、删除镜像标签
docker rmi docker.io/albatross7/alpine:v3.13.3
9、删除镜像
docker rmi 302aba9ce190
10、强制删除镜像
docker rmi -f 302aba9ce190
三、Docker容器基本操作
1、查看docker本地容器的进程
docker ps -a
2、实例化容器(运行镜像)
docker run 是日常使用最频繁的命令之一,同样也是较为复杂的命令之一
命令格式:docker run [OPTIONS]IMAGE[COMMAND][ARG...]
OPTIONS:选项
-i:表示启动一个可交互的容器,并持续打开标准输入
-t:表示使用终端关联到容器的标准输入输出上
-d:表示将容器放置后台运行
--rm:退出后立即删除容器
--name:表示定义容器唯一名称
IMAGE:表示要运行的镜像
COMMAND:表示启动容器时要运行的命令*
3、交互式启动一个容器
docker run -ti alpine /bin/sh
- 关闭一个容器
//退出当前容器
exit
4、交互式启动一个容器
docker run -ti alpine /bin/sh
- 关闭一个容器
//退出当前容器
exit
5、非交互式启动容器
//--rm 启动完成直接删除容器
docker run --rm albatross7/alpine /bin/echo hello
6、非交互式容器
docker run -d --name myalpine1 albatross7/alpine:v3.13.3 /bin/sleep 300
7、进程查询
ps aux|grep sleep|grep -v grep
8、进程查询
]# docker exec -ti 2e3441da52d2 /bin/sh
/ # pa aux
/bin/sh: pa: not found
/ # ps
PID USER TIME COMMAND
1 root 0:00 /bin/sleep 300
7 root 0:00 /bin/sh
14 root 0:00 ps
/ # exit
9、启动、停止、重启容器
//如果使用了--name myalpine 可以直接用
docker start/stop/restart myalpine
//如果没有设置名字,则使用容器ID
docker start/stop/restart [CONTAINER ID]
10、删除容器
//如果使用了--name myalpine 可以直接用
docker rm myalpine
//如果没有设置名字,则使用容器ID
docker rm [CONTAINER ID]
//强制删除容器
docker rm -f [CONTAINER ID]
//使用脚本删除所有Exit的容器
for i in `docker ps -a|grep -i exit|awk '{print $1}'`;do docker rm -f $i;done
11、修改容器
11.1. 进入容器
docker exec -it myalpine2 /bin/bash
11.2. 创建一个文件写入hello
echo hello > 1.txt
exit
11.3. 提交容器
docker commit -p myalpine2 albatross7/alpine:v3.13.3_with_1.txt
11.4. 导入导出镜像
//导出
docker save 0d50832ba0fa > alpineLv3.13.3_with1.txt.tar
//导入
docker load < alpineLv3.13.3_with1.txt.tar
//导入的镜像没有标签,从新加
docker tag 0d50832ba0fa albatross7/alpine:v3.13.3_with_1.txt
11.5. 查看容器日志
//屏蔽当前容器控制台输出(不屏蔽也可以看log)
docker run hello-world 2>&1 >>/dev/null
//-f 动态输出
[root@localhost ~]# docker logs -f 56270cec3974
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
12、所有级别的容器命令
docker中 启动所有的容器命令
docker start $(docker ps -a | awk '{ print $1}' | tail -n +2)
docker中 关闭所有的容器命令
docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2)
docker中 删除所有的容器命令
docker rm $(docker ps -a | awk '{ print $1}' | tail -n +2)
docker中 删除所有的镜像
docker rmi $(docker images | awk '{print $3}' |tail -n +2)
四、Docker容器高级操作**
准备操作 -----> 安装nginx
docker nginx:1.16.1
//加标签
docker tag dfcfd8e9a5d3 albatross7/nginx:v1.16.1
1.映射端口 *
// docker run -p 容器外的端口:容器里的端口
docker run --rm --name myNginx -d -p81:80 albatross7/nginx:v1.16.1
//查看监听端口
netstat -luntp|grep 81
//抓取网页
curl 127.0.0.1:81
2、挂载数据卷
//创建目录
mkdir html
//进入目录
cd html
//下载百度首页
wget www.baidu.com -O index.html
// docker run -v 容器外目录:容器内目录
docker run --rm --name baiduNginx -d -p82:80 -v/root/html:/usr/share/nginx/html albatross7/nginx:v1.16.1
//查看系统容量命令:
df -h
//查看容器内部挂载
//docker inspect 容器ID |grep 挂载目录关键字
docker inspect b0237d6c00a4|grep share
3、传递环境变量**
//-e 变量key=变量value 单个
docker run --rm -e E_OPTS=abcsefg albatross7/nginx:v1.16.1 printenv
//-e 变量key=变量value -e 变量key=变量value 多个
docker run --rm -e E_OPTS=abcsefg -e C_OPTE=123456 albatross7/nginx:v1.16.1 printenv
4、容器内安装软件*****
//进入容器
docker exec -it b0237d6c00a4 /bin/bash
//更改下载源
tee /etc/apt/sources.list << EOF
deb http:mirrors.163.com/debian/ jessie main non-free contrib
deb http://mirrors.163.com/debian/ jessie-updates main non-free contrib
EOF
//更新 apt
apt update
//安装软件apt install 软件
apt install curl
//执行提交
docker commit -p 113765fbf88a albatross7/nginx:curl
//push
docker push albatross7/nginx:curl
五、Dockerfile
1、Dockerfile概述
- Docker引擎可以从Dockerfile中读取指令,帮助我们自动化构建镜像。
- Dockerfile本质是一个的文本文件,它包含了一个用户编写的指令,帮助你去组装一个镜像。
- 使用
docker bulid
命令,就可以根据Dockerfile自动化构建一个镜像。
2、Dockerfile的规则
- 格式
- #为注释
- 指令(大写)内容(小写)
- 尽管指令是大小写不敏感的,但是我们还是建议安照这个规范进行。
- Docker是按顺序执行Dockerfile里的指令集合的(从上到下依次执行)
- 每一个Dockerfile的一个非注释行指令,必须是"FROM"指令,用于为镜像文件构建过程中,指定基准镜像,后续的指令运行于此基准镜像所提供的运行环境中
- 实践中,基准镜像可以是任何可用的镜像文件,默认情况下,docker bulid会在docker 主机(本地)上查找指定的镜像文件,当镜像在本地不存在时,则会从Docker registry(远端)上拉取所需镜像文件
3、Dockerfile指令
3.1 USER/WORKDIR指令
- 指明PID为1的进程所在用户
//编辑Dockerfile文件
vi /data/dockerfile/Dockerfile
FROM docker.io/albatross7/nginx:curl
USER root
WORKDIR /usr/share/nginx/html
- 构建镜像指令
// . 指当前目录下 -t 加一个tag
docker build . -t docker.io/albatross7/nginx:curl_with_user_workdir
//启动并查看当前用户
docker run --rm --name myNginx -it albatross7/nginx:curl_with_user_workdir /bin/bash
root@5d1e9e981171:/usr/share/nginx/html# whoami
root
root@5d1e9e981171:/usr/share/nginx/html# pwd
/usr/share/nginx/html
3.2 ADD/EXPOSE指令
- ADD : copy
- EXPOSE : 定义容器中的哪个端口要被暴露出来
vi /data/dockerfile/Dockerfile
FROM docker.io/albatross7/nginx:curl
ADD index.html /usr/share/nginx/html/index.html
EXPOSE 80
//--启动后(这里启动失败了,没继续尝试)查看端口
netstat -l
3.3 RUN/ENV指令
- RUN: 构建镜像时执行一系列操作
- ENV: 环境变量
vi /data/dockerfile/Dockerfile
FROM centos:7
ENV VER 9.11.4
RUN yum install bind-$VER -y
3.4 CMD/ENTRYPOINT指令
- CMD: 启动容器时运行一系列操作
- ENTRYPOINT: 环境变量
vi /data/dockerfile/Dockerfile
FROM centos:7
CMD ["httpd","-D","FOREGROUND"]
RUN yum install httpd -y
3.5 Dcokerfile
FROM 192.168.8.33/public/jdk:v1.8
MAINTAINER sunjie
ARG JAR_FILE
COPY ./target/classes/ /project/blackspider/config/
COPY ${JAR_FILE} /project/blackspider/blackspider.jar
#设置时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
RUN chmod 755 /project/blackspider/config/
EXPOSE 9083
WORKDIR /project/blackspider/
ENTRYPOINT ["java","-Xms512m","-jar","/project/blackspider/blackspider.jar"]
六、Docker的网络模型
- NAT(默认)
docker run --rm -it nginx:1.16.1 /bin/bash
//docker的base镜像只包含简单的操作系统,其他命令需要自己安装:
apt update && apt install -y iproute2
//查看ip
ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
4: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
- None
docker run --rm -it --net=none nginx:1.16.1 /bin/bash
//查看ip
ip add
- Host
docker run --rm -it --net=host nginx:1.16.1 /bin/bash
- 联合网络
*
两个容器共享一个命名空间
//初始化一个容器
docker run -d nginx:1.16.1
//查看当前运行的容器
docker ps -a
//启动一个联合网络
docker run -it --rm --net=container:d8fcc0141d12 nginx:1.16.1 /bin/bash
Dockerfile示例
FROM 192.168.8.33/public/jdk:v1.8
MAINTAINER sunjie
ARG JAR_FILE
COPY ./target/classes/ /project/blackspider/config/
COPY ${JAR_FILE} /project/blackspider/blackspider.jar
#安装时区数据 tzdata
RUN apk add -U tzdata
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN chmod 755 /project/blackspider/config/
EXPOSE 9083
WORKDIR /project/blackspider/
ENTRYPOINT ["java","-Xms512m","-jar","/project/blackspider/blackspider.jar"]