欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

docker入门教程

程序员文章站 2022-06-17 08:46:31
...

1.docker安装

卸载已有安装包

sudo apt-get remove docker docker-engine docker.io containerd runc

更新apt包索引

sudo apt-get update

安装apt依赖包

sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

添加 Docker 的官方 GPG **

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

设置稳定版仓库

sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) \
  stable"

更新 apt 包索引

sudo apt-get update

安装最新版本的 Docker Engine-Community 和 containerd

sudo apt-get install docker-ce docker-ce-cli containerd.io

安装过程较慢,可以设置阿里云镜像,配置apt源进行下载(http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo)
测试 Docker 是否安装成功

sudo docker run hello-world

2.Docker 镜像加速

编辑 /etc/docker/daemon.json

{"registry-mirrors":["https://registry.docker-cn.com"]}

重新启动服务

sudo service docker restart

3.docker容器使用

获取镜像

docker pull ubuntu

启动容器

docker run -it ubuntu /bin/bash

-i: 交互式操作。
-t: 终端。
ubuntu: ubuntu 镜像。
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash
退出容器

exit

查看所有的容器

docker ps -a

启动一个已停止的容器

docker start 容器id

后台运行

docker run -itd --name ubuntu-test ubuntu /bin/bash

停止容器

docker stop <容器 ID>

重启容器

docker restart <容器 ID>

进入容器

docker attach
docker exec:推荐大家使用 docker exec 命令,因为此退出容器终端,不会导致容器的停止
docker exec -it 容器id /bin/bash

导出容器 导出容器 1e560fca3906 快照到本地文件 ubuntu.tar

docker export 1e560fca3906 > ubuntu.tar

导入容器快照 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1

cat docker/ubuntu.tar | docker import - test/ubuntu:v1
docker import http://example.com/exampleimage.tgz example/imagerepo

删除容器

docker rm -f 1e560fca3906

4.镜像使用

列出镜像列表

docker images 

获取一个新的镜像

docker pull ubuntu:13.10

查找镜像

docker search centos

拖取镜像

docker pull centos

删除镜像

docker rmi hello-world

创建镜像
1)、从已经创建的容器中更新镜像,并且提交这个镜像
2)、使用 Dockerfile 指令来创建一个新的镜像
更新镜像
更新镜像之前,我们需要使用镜像来创建一个容器。

docker run -t -i ubuntu:15.10 /bin/bash

在运行的容器内使用 apt-get update 命令进行更新
在完成操作之后,输入 exit 命令来退出这个容器
通过命令 docker commit 来提交容器副本

docker commit -m="has update" -a="image" e218edb10161 image/ubuntu:v2
sha256:70bf1840fd7c0d2d8ef0a42a817eb29f854c1af8f7c59fc03ac7bdee9545aff8

-m: 提交的描述信息
-a: 指定镜像作者
e218edb10161:容器 ID
image/ubuntu:v2: 指定要创建的目标镜像名

构建镜像
Dockerfile文件内容如下:

FROM    centos:6.7
MAINTAINER "[email protected]"

RUN     /bin/echo 'root:123456' |chpasswd
RUN     useradd user
RUN     /bin/echo 'user:123456' |chpasswd
RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE  22
EXPOSE  80
CMD     /usr/sbin/sshd -D 

每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的
docker build -t user/centos:6.7 .
-t :指定要创建的目标镜像名
. :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径

设置镜像标签

docker tag 860c279d2fec user/centos:dev

5.容器连接

网络端口映射

docker run -d -P training/webapp python app.py
docker run -d -p 5000:5000 training/webapp python app.py

-P :是容器内部端口随机映射到主机的高端口
-p : 是容器内部端口绑定到指定的主机端口
指定容器绑定的网络地址

docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py

我们可以通过访问 127.0.0.1:5001 来访问容器的 5000 端口
Docker 容器互联
端口映射并不是唯一把 docker 连接到另一个容器的方法。
docker 有一个连接系统允许将多个容器连接在一起,共享连接信息。
docker 连接会创建一个父子关系,其中父容器可以看到子容器的信息。
容器命名
当我们创建一个容器的时候,docker 会自动对它进行命名。另外,我们也可以使用 --name 标识来命名容器,例如:

[email protected]:~$  docker run -d -P --name runoob training/webapp python app.py
43780a6eabaaf14e590b6e849235c75f3012995403f97749775e38436db9a441

我们可以使用 docker ps 命令来查看容器名称。

[email protected]:~$ docker ps -l
CONTAINER ID     IMAGE            COMMAND           ...    PORTS                     NAMES
43780a6eabaa     training/webapp   "python app.py"  ...     0.0.0.0:32769->5000/tcp   runoob

新建网络
下面先创建一个新的 Docker 网络。

$ docker network create -d bridge test-net

-d:参数指定 Docker 网络类型,有 bridge、overlay。
其中 overlay 网络类型用于 Swarm mode,在本小节中你可以忽略它。
连接容器
运行一个容器并连接到新建的 test-net 网络:

$ docker run -itd --name test1 --network test-net ubuntu /bin/bash

打开新的终端,再运行一个容器并加入到 test-net 网络:

$ docker run -itd --name test2 --network test-net ubuntu /bin/bash

下面通过 ping 来证明 test1 容器和 test2 容器建立了互联关系。
如果 test1、test2 容器内中无 ping 命令,则在容器内执行以下命令安装 ping(即学即用:可以在一个容器里安装好,提交容器到镜像,在以新的镜像重新运行以上俩个容器)。

apt-get update
apt install iputils-ping

在 test1 容器输入以下命令:

ping test2

配置 DNS
我们可以在宿主机的 /etc/docker/daemon.json 文件中增加以下内容来设置全部容器的 DNS:
{
“dns” : [
“114.114.114.114”,
“8.8.8.8”
]
}
设置后,启动容器的 DNS 会自动配置为 114.114.114.114 和 8.8.8.8。
配置完,需要重启 docker 才能生效。
查看容器的 DNS 是否生效可以使用以下命令,它会输出容器的 DNS 信息:

$ docker run -it --rm ubuntu  cat etc/resolv.conf

手动指定容器的配置
如果只想在指定的容器设置 DNS,则可以使用以下命令:

$ docker run -it --rm host_ubuntu  --dns=114.114.114.114 --dns-search=test.com ubuntu

参数说明:
-h HOSTNAME 或者 --hostname=HOSTNAME: 设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts。
–dns=IP_ADDRESS: 添加 DNS 服务器到容器的 /etc/resolv.conf 中,让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名。
–dns-search=DOMAIN: 设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的主机时,DNS 不仅搜索 host,还会搜索 host.example.com。
如果在容器启动时没有指定 --dns 和 --dns-search,Docker 会默认用宿主主机上的 /etc/resolv.conf 来配置容器的 DNS。

6.Docker 仓库管理

Docker Hub
目前 Docker 官方维护了一个公共仓库 Docker Hub。
大部分需求都可以通过在 Docker Hub 中直接下载镜像来实现。
登录和退出

docker login
docker logout

推送镜像
用户登录后,可以通过 docker push 命令将自己的镜像推送到 Docker Hub。
以下命令中的 username 请替换为你的 Docker 账号用户名。

docker tag ubuntu:18.04 username/ubuntu:18.04

7.Dockerfile

Dockerfile 是一个用来构建镜像的文本文件

FROM 指明构建的新镜像是来自于哪个基础镜像
FROM centos:6
MAINTAINER 指明镜像维护着及其联系方式(一般是邮箱地址)
MAINTAINER dison<[email protected]>
RUN 构建镜像时运行的Shell命令
RUN yum install httpd
CMD 启动容器时执行的Shell命令
CMD /usr/sbin/sshd -D
EXPOSE 声明容器运行的服务端口
EXPOSE 80 443
ENV  设置环境内环境变量
ADD 拷贝文件或目录到镜像中 如果是URL或压缩包,会自动下载或自动解压
ADD html.tar.gz /var/www/html
COPY 拷贝文件或目录到镜像中,用法同ADD,只是不支持自动下载和解压
COPY ./start.sh /start.sh
ENTRYPOINT 启动容器时执行的Shell命令,同CMD类似,只是由ENTRYPOINT启动的程序不会被docker run命令行指定的参数所覆盖,而且,这些命令行参数会被当作参数传递给ENTRYPOINT指定指定的程序
ENTRYPOINT /bin/bash -C '/start.sh'
VOLUME 指定容器挂载点到宿主机自动生成的目录或其他容器 一般不会在Dockerfile中用到,更常见的还是在docker run的时候指定-v数据卷
VOLUME ["/var/lib/mysql"]
USER 为RUN、CMD和ENTRYPOINT执行Shell命令指定运行用户
USER <user>[:<usergroup>]
USER <UID>[:<UID>]
USER root
WORKDIR  为RUN、CMD、ENTRYPOINT以及COPY和AND设置工作目录
WORKDIR /data
HEALTHCHECK 告诉Docker如何测试容器以检查它是否仍在工作,即健康检查
HEALTHCHECK --interval=5m --timeout=3s --retries=3 \
    CMD curl -f http:/localhost/ || exit 1
其中,一些选项的说明:

 --interval=DURATION (default: 30s):每隔多长时间探测一次,默认30秒
 -- timeout= DURATION (default: 30s):服务响应超时时长,默认30秒
 --start-period= DURATION (default: 0s):服务启动多久后开始探测,默认0秒
 --retries=N (default: 3):认为检测失败几次为宕机,默认3次
  一些返回值的说明:

 0:容器成功是健康的,随时可以使用
 1:不健康的容器无法正常工作
 2:保留不使用此退出代码
ARG 在构建镜像时,指定一些参数
FROM centos:6
ARG user # ARG user=root
USER $user

综合Dockerfile案例

FROM centos:7
MAINTANIER www.edisonchou.com

ADD jdk-8u45-linux-x64.tar.gz /usr/local
ENV JAVA_HOME /usr/local/jdk1.8.0_45

ADD apache-tomcat-8.0.46.tar.gz /usr/local
COPY server.xml /usr/local/apache-tomcat-8.0.46/conf

RUN rm -f /usr/local/*.tar.gz

WORKDIR /usr/local/apache-tomcat-8.0.46
EXPOSE 8080
ENTRYPOINT ["./bin/catalina.sh", "run"]

有了Dockerfile,就可以创建镜像了

docker build -t tomcat:v1 .
docker run -itd --name=tomcate -p 8080:8080 \
    -v /app/webapps/:/usr/local/apache-tomcat-8.0.46/webapps/ \
    tomcat:v1

8. Compose

# yaml 配置实例
version: '3'
services:
  web:
    build: .
    ports:
   - "5000:5000"
    volumes:
   - .:/code
    - logvolume01:/var/log
    links:
   - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

使用 Compose 命令构建和运行您的应用

docker-compose up

在后台执行该服务可以加上 -d

docker-compose up -d

9.docker命令

容器生命周期管理
run
start/stop/restart
kill
rm
pause/unpause
create
exec
容器操作
ps
inspect
top
attach
events
logs
wait
export
port
容器rootfs命令
commit
cp
diff
镜像仓库
login
pull
push
search
本地镜像管理
images
rmi
tag
build
history
save
load
import
info|version
info
version
相关标签: docker