10. Docker 安装与配置
docker pull 450120127/pythonv2
1. 为什么docker越来越受欢迎
Docker 是一个开源的应用容器引擎,基于LXC(Linux Container)内核虚拟化技术实现,提供一系列更强的功能,比如镜像、 Dockerfile等;Docker理念是将应用及依赖包打包到一个可移植的容器中,可发布到任意Linux发行版Docker引擎上。使用沙箱机制运行程序, 程序之间相互隔离;
容器Docker
容器化越来越受欢迎,因为容器是:
灵活:即使是最复杂的应用也可以集装箱化。
轻量级:容器利用并共享主机内核。
可互换:您可以即时部署更新和升级。
便携式:您可以在本地构建,部署到云,并在任何地方 运行。
可扩展:您可以增加并自动分发容器副本。
可堆叠:您可以垂直和即时堆叠服务。
一致的运行环境
镜像和容器(contalners)
通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间,库、环境变量、和配置文件。
容器是镜像的运行实例,当被运行时有镜像状态和用户进程,可以使用docker ps 查看。
容器Docker和虚拟机
容器是在linux上本机运行,并与其他容器共享主机的内核,它运行的一个独立的进程,不占用其他任何可执行文件的内存,非常轻量、高效、快速。
虚拟机运行的是一个完成的操作系统,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多。
2. Docker安装与设置
参考:https://www.cnblogs.com/codingbit/p/install-docker-in-ubuntu.html
2.1 Linux下安装docker
Linux版本CentOS7
1.安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
2.设置镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.安装Docker-CE
yum install docker-ce
4.启动Docker
#启动
systemctl start docker
#重新启动
systemctl restart docker
# 开机自启
systemctl enable docker
5.测试
docker run hello-world
docker version
6.拉取镜像
docker pull <镜像名:tag>
7. 删除镜像
[dell@Centos7 docker]$ sudo docker ps -a
[sudo] password for dell:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
12287341323d ubuntu "bash" 4 minutes ago Exited (0) 15 seconds ago relaxed_zhukovsky
eaecf11eb3ca hello-world "/hello" 7 minutes ago Exited (0) 7 minutes ago laughing_goodall
582b1516f99c hello-world "/hello" 7 hours ago Exited (0) 7 hours ago eager_montalcini
[dell@Centos7 docker]$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest f643c72bc252 4 weeks ago 72.9MB
hello-world latest bf756fb1ae65 11 months ago 13.3kB
[dell@Centos7 docker]$ sudo docker rm eaecf11eb3ca
eaecf11eb3ca
[dell@Centos7 docker]$ sudo docker rm 582b1516f99c
582b1516f99c
[dell@Centos7 docker]$ sudo docker rmi hello-world
Untagged: hello-world:latest
Untagged: hello-world@sha256:1a523af650137b8accdaed439c17d684df61ee4d74feac151b5b337bd29e7eec
Deleted: sha256:bf756fb1ae65adf866bd8c456593cd24beb6a0a061dedf42b26a993176745f6b
Deleted: sha256:9c27e219663c25e0f28493790cc0b88bc973ba3b1686355f221c38a36978ac63
[dell@Centos7 docker]$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest f643c72bc252 4 weeks ago 72.9MB
2.2 国内容器镜像加速
使用加速器可以提升获取Docker官方镜像的速度,下面使用阿里云镜像进行加速。
通过修改daemon配置文件/etc/docker/daemon.json
来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://jjzi6741.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
2.3 使用非 root 用户管理运行 Docker
Docker 守护进程绑定在 Unix socket 而不是 TCP 端口。默认情况下 Unix socket 归属于 root 用户,其他用户只能通过 sudo 命令访问。所以 Docker 守护进程总是以 root 用户来运行。
如果你不希望每次运行 docker 命令时在前面加上 sudo,你可以创建一个 docker 用户组并把用户加进去。当 Docker 守护进程启动时,会创建一个 Unix socket 供 docker 用户组成员访问
创建 docker 用户组并添加你的用户
创建 docker 用户组
sudo groupadd docker
添加你的用户到 docker 用户组
sudo usermod -aG docker $USER
重新登录以试权限生效。
验证是否可以不使用 sudo 命令来运行 docker
docker run hello-world
这个命令会下载一个 test 镜像并在容器中运行。运行完成后,会显示欢迎信息并退出。
如果你在把用户加到 docker 用户组之前使用了 sudo 运行过 Docker 命令,可能会遇到下面的错误提示,是因为 ~/.docker/ 权限不对导致的。
WARNING: Error loading config file: /home/user/.docker/config.json -
stat /home/user/.docker/config.json: permission denied
解决这个问题,可以通过删除 ~/.docker/ 目录(自定义设置会丢失),或者用下面的命令来更改权限。
sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
sudo chmod g+rwx "$HOME/.docker" -R
3. Docker常用命令
参考:
1.整理了一份 Docker系统知识,从安装到熟练操作看这篇就够了 | 原力计划
1.拉取镜像
docker pull
2.删除容器
docker rm <容器名 or ID>
3.查看容器日志
docker logs -f <容器名 or ID>
#查看最近100行日志
docker logs -f --tail=100 containername
4.查看正在运行的容器
docker ps
docker ps -a # 为查看所有的容器,包括已经停止的。
5.停止、启动、杀死指定容器
docker start <容器名 or ID> # 启动容器
docker stop <容器名 or ID> # 启动容器
docker kill <容器名 or ID> # 杀死容器
6.查看所有镜像
docker images
7.后台运行
docker run -d <Other Parameters>
# 例如
docker run -d -p 127.0.0.1:33301:22 centos6-ssh
8.暴露端口
# 一共有三种形式进行端口映射
docker -p ip:hostPort:containerPort # 映射指定地址的主机端口到容器端口
# 例如:docker -p 127.0.0.1:3306:3306 映射本机3306端口到容器的3306端口
docker -p ip::containerPort # 映射指定地址的任意可用端口到容器端口
# 例如:docker -p 127.0.0.1::3306 映射本机的随机可用端口到容器3306端口
docer -p hostPort:containerPort # 映射本机的指定端口到容器的指定端口
# 例如:docker -p 3306:3306 # 映射本机的3306端口到容器的3306端口
4. Docker系统管理-基础
4.1 Docker Hub
https://hub.docker.com/
什么是 DockerHub 以及为什么它很重要?DockerHub 是一个由 Docker 公司运行和管理的基于云的存储库。它是一个在线存储库,Docker 镜像可以由其他用户发布和使用。
有两种库:公共存储库和私有存储库。如果你是一家公司,你可以在你自己的组织内拥有一个私有存储库,而公共镜像可以被任何人使用。
镜像层和容器层
1.登录
[dell@Centos7 ~]$ docker login
2.搜索镜像
[dell@Centos7 ~]$ docker search centos
3.使用centos 创建centos-test容器
[dell@Centos7 ~]$ docker run --name centos-test -it centos /bin/bash
[root@bf4e0360033c /]# ls
4.2 Docker 核心组件
Docker 客户端
Docker 客户端其实是一种泛称。其中docker 命令是Docker 用户与 Docker 服务端交互或管理 的主要方式。
在Linux系统下,Docker Client 和Docker daemon 和容器直接运行在虚拟机上,这意味着容器可直接食用宿主机端口资源,不需要在容器和宿主机之间映射端口;
除了使用 docker 命令的方式,还可以使用直接请求REST API 的方式与Docker 服务端交互,甚至还可以使用各种语言的SDK 与Docker 服务端交互。目前社区维护着 Go、Java、Python、PHP 等数十种语言的SDK,足以满足大家的日常需求。
Docker 服务端
Docker 服务端是Docker 所有后台服务的统称。其中dockerd 是一个非常重要的后台管理进程,它负责响应和处理来自Docker 客户端的请求,然后将客户端的请求转化为Docker 的具体操作。
例如:镜像、容器、网络和挂载卷等具体对象的操作和管理。
Docker 从诞生到现在,服务端经历了多次架构重构。起初,服务端的组件是全部集成在docker 二进制里。但是从 1.11 版本开始, dockerd 已经成了独立的二进制,此时的容器也不是直接由dockerd 来启动了,而是集成了containerd、runC 等多个组件。
虽然 Docker 的架构在不停重构,但是各个模块的基本功能和定位并没有变化。它和一般的 C/S 架构系统一样,Docker 服务端模块负责和 Docker 客户端交互,并管理Docker 的容器、镜像、网络等资源。
Docker 重要组件
Docker 有两个至关重要的组件:runC和containerd。
runC是Docker 官方按照OCI 容器运行时标准的一个实现。通俗地讲,runC 是一个用来运行容器的轻量级工具,是真正用来运行容器的。
containerd是Docker 服务端的一个核心组件,它是从dockerd 中剥离出来的 ,它的诞生完全遵循OCI 标准,是容器标准化后的产物。containerd通过containerd-shim 启动并管理runC,可以说containerd真正管理了容器的生命周期。
容器基本命令
1. 容器中长期运行 程序
有两种方式:
1.容器中长期运行 程序
[dell@Centos7 ~]$ docker run centos /bin/bash -c "while true;do sleep 1;done"
[dell@Centos7 ~]$ docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7073d95f8c05 centos "/bin/bash -c 'while…" 3 minutes ago Up 3 minutes nifty_kapitsa
2. 使用 -d 参数
[dell@Centos7 ~]$ docker run -d centos /bin/bash -c "while true;do sleep 1;done"
f648d802fc586569f11ed675ccf6eaa130b6c8c587dddc4ed176affc7ef90c8f # 容器ID
[dell@Centos7 ~]$ docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f648d802fc58 centos "/bin/bash -c 'while…" 46 seconds ago Up 45 seconds amazing_hopper
# -d参数 指定名称--name
[dell@Centos7 ~]$ docker run --name centos-while -d centos /bin/bash -c "while true;do sleep 1;done"
ef5a1afbd7dc3fc36ae591fd0f57d1c93c1fa878e7410c278b898f462ad9bffb
[dell@Centos7 ~]$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ef5a1afbd7dc centos "/bin/bash -c 'while…" 8 seconds ago Up 6 seconds centos-while
f648d802fc58 centos "/bin/bash -c 'while…" 3 minutes ago Up 3 minutes amazing_hopper
7073d95f8c05 centos "/bin/bash -c 'while…" 3 hours ago Up 3 hours nifty_kapitsa
bf4e0360033c centos "/bin/bash" 3 hours ago Exited (0) 3 hours ago centos-test
c972228d73bc ubuntu "/bin/bash" 4 hours ago Exited (0) 4 hours ago vigilant_shirley
12287341323d ubuntu "bash" 4 hours ago Exited (0) 4 hours ago
2. 容器 开启和停止 程序
有两种方式
1. stop 较慢
[dell@Centos7 ~]$ docker stop amazing_hopper
2. kill
[dell@Centos7 ~]$ docker kill centos-while
# 开启
docker start ad78d838e40e
# 暂停
docker pause ad78d838e40e
# 运行
docker unpause ad78d838e40e
# 删除容器
docker rm ad78d838e40e
# 批量删除 已经退出的容器;
[dell@Centos7 ~]$ docker rm -v $(docker ps -aq -f status=exited)
ad78d838e40e
bf4e0360033c
12287341323d
3. 进入容器
有2种方法
1. attach
[dell@Centos7 ~]$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ad78d838e40e centos "/bin/bash -c 'while…" 12 seconds ago Up 10 seconds youthful_wilesef5a1afbd7dc
[dell@Centos7 ~]$ docker attach ad78d838e40e
hello world
hello world
2.exec
[dell@Centos7 ~]$ docker exec -it ad78d838e40e bash
[root@ad78d838e40e /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 22:54 ? 00:00:00 /bin/bash -c while true;do sleep 1;echo hello world;done
root 475 0 0 23:02 pts/0 00:00:00 bash
root 497 1 0 23:02 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
root 498 475 0 23:02 pts/0 00:00:00 ps -ef
5. Docker 部署在Web上
想要web部署在互联网上 或者 在Web上访问 应用;
5.1 Docker host 部署在公网上
个人电脑处于 私网中;IP地址处于 IPV4 和 IPV6 ;
[dell@Centos7 ~]$ docker run -d -p 80 httpd
[dell@Centos7 ~]$ docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
99f0701e686e httpd "httpd-foreground" 11 seconds ago Up 10 seconds 0.0.0.0:49153->80/tcp sad_meninsky
# http 容器提供的Web服务;
IP: 192.168.0.100:49153
It works!
# 容器80端口 映射到 docker_host 80端口
docker run -d -p 80:80 httpd
IP: 192.168.0.100:80
It works!
5.2 Docker中 安装应用
安装appium
方法1:直接安装
排错,困难
方法2:直接下载安装好的docker镜像
https://hub.docker.com/r/appium/appium
[dell@Centos7 ~]$ docker search appium
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
appium/appium Docker Image for Appium Android 57 [OK]
[dell@Centos7 ~]$ docker pull appium/appium
测试adb
改变TCPIP连接方式
# 连接docker内 容器 qppium1
docker exec -it appium1 adb connect 192.168.0.100:5555
docker exec -it appium1 adb devices
查看appium运行日志
容器端口号为 4723
6. Docker 镜像的创建
有两种方法
1.使用 commit 创建docker镜像
2.编写Dockerfile 创建docker镜像
1.使用 commit 创建docker镜像
开启nginx,就可以在web访问 192.168.0.100;
1.开启一个以nginx镜像的名称叫webserver的容器,端口为80
[dell@Centos7 ~]$ docker run --name webserver -d -p 80:80 nginx
替换默认页面
[dell@Centos7 ~]$ docker exec -it webserver bash
root@be4957779b99:/# echo '<h1>Hello Docker!</h1>' >/usr/share/nginx/html/index.html
查看容器的改动
[dell@Centos7 ~]$ docker diff webserver
C /root
A /root/.bash_history
C /var
C /var/cache
C /var/cache/nginx
A /var/cache/nginx/client_temp
A /var/cache/nginx/fastcgi_temp
A /var/cache/nginx/proxy_temp
A /var/cache/nginx/scgi_temp
A /var/cache/nginx/uwsgi_temp
C /etc
C /etc/nginx
C /etc/nginx/conf.d
C /etc/nginx/conf.d/default.conf
C /usr
C /usr/share
C /usr/share/nginx
C /usr/share/nginx/html
C /usr/share/nginx/html/index.html
C /run
A /run/nginx.pid
2. 创建镜像
[dell@Centos7 ~]$ docker commit --author "BeautifulSoul <syppp520@163.com>" --message "Modify default page" webserver nginx:v2
sha256:05f41d0fa6861f17dcda1af20942f43a6af1c8d72234753629b7931c3787c295
[dell@Centos7 ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v2 05f41d0fa686 6 seconds ago 133MB
nginx latest ae2feff98a0c 9 days ago 133MB
查看镜像的操作
[dell@Centos7 ~]$ docker history nginx:v2
IMAGE CREATED CREATED BY SIZE COMMENT
05f41d0fa686 About a minute ago nginx -g daemon off; 1.21kB Modify default page
ae2feff98a0c 9 days ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B
<missing> 9 days ago /bin/sh -c #(nop) STOPSIGNAL SIGQUIT 0B
<missing> 9 days ago /bin/sh -c #(nop) EXPOSE 80 0B
<missing> 9 days ago /bin/sh -c #(nop) ENTRYPOINT ["/docker-entr… 0B
<missing> 9 days ago /bin/sh -c #(nop) COPY file:0fd5fca330dcd6a7… 1.04kB
<missing> 9 days ago /bin/sh -c #(nop) COPY file:0b866ff3fc1ef5b0… 1.96kB
<missing> 9 days ago /bin/sh -c #(nop) COPY file:e7e183879c35719c… 1.2kB
<missing> 9 days ago /bin/sh -c set -x && addgroup --system -… 63.7MB
<missing> 9 days ago /bin/sh -c #(nop) ENV PKG_RELEASE=1~buster 0B
<missing> 9 days ago /bin/sh -c #(nop) ENV NJS_VERSION=0.5.0 0B
<missing> 9 days ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.19.6 0B
<missing> 13 days ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B
<missing> 2 weeks ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ADD file:3a7bff4e139bcacc5… 69.2MB
3. 开启新镜像 端口号:192.168.0.100:81
[dell@Centos7 ~]$ docker run --name web2 -d -p 81:80 nginx:v2
c467ad9b175ddf4f75a0e649ee671ebf157f9640430ce7948fcb8ae6cbe27d68
[dell@Centos7 ~]$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c467ad9b175d nginx:v2 "/docker-entrypoint.…" 37 seconds ago Up 36 seconds 0.0.0.0:81->80/tcp web2
2. 编写Dockerfile 定制创建docker镜像
Dockerfile其实可以看做一个命令集。每行均为一条命令。每行的第一个单词,就是命令command。后面的字符串是该命令所要接收的参数。比如ENTRYPOINT /bin/bash。ENTRYPOINT命令的作用就是将后面的参数设置为镜像的entrypoint。至于现有命令的含义,这里不再详述。DockOne上有很多的介绍。
1.配置Dockerfile
[dell@Centos7 ~]$ mkdir mynginx
[dell@Centos7 ~]$ cd mynginx/
[dell@Centos7 mynginx]$ touch Dockerfile
[dell@Centos7 mynginx]$ nano Dockerfile
FROM nginx
RUN echo '<h1>Hello Docker!</h1>' >/usr/share/nginx/html/index.html
2.定制创建镜像
[dell@Centos7 mynginx]$ ll
total 4
-rw-rw-r--. 1 dell dell 79 Dec 25 11:11 Dockerfile
[dell@Centos7 mynginx]$ docker build -t nginx:v3 .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM nginx
---> ae2feff98a0c
Step 2/2 : RUN echo '<h1>Hello Docker!</h1>' >/usr/share/nginx/html/index.html
---> Running in 51bd778481ad
Removing intermediate container 51bd778481ad
---> 6eee51e5773e
Successfully built 6eee51e5773e
Successfully tagged nginx:v3
3. 上传docker镜像
[dell@Centos7 mynginx]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v3 6eee51e5773e 4 minutes ago 133MB
查看账号正常登陆
[dell@Centos7 mynginx]$ docker info
Username: 425338522
修改镜像名称为仓库对应的名称
[dell@Centos7 mynginx]$ docker tag nginx:v3 425338522/nginx_v3:v3
查看镜像
[dell@Centos7 mynginx]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
425338522/nginx_v3 v3 6eee51e5773e 10 minutes ago 133MB
上传镜像
[dell@Centos7 mynginx]$ docker push 425338522/nginx_v3
下载镜像
docker pull 450120127/pythonv2
Dockerfile 指令详解
参考:
1.Docker(三):Dockerfile 命令详解
1.FROM 指定基础镜像
FROM 指令用于指定其后构建新镜像所使用的基础镜像。FROM 指令必是 Dockerfile 文件中的首条命令,启动构建流程后,Docker 将会基于该镜像构建新镜像,FROM 后的命令也会基于这个基础镜像。
FROM <image>
FROM <image>:<tag>
FROM <image>:<digest>
2.RUN 执行命令
在镜像的构建过程中执行特定的命令,并生成一个中间镜像。格式:
RUN <command>
RUN ["executable", "param1", "param2"]
最多127层,不是写shell ;
错误的写法 正确的写法