Docker 安装

来自ling
跳转至: 导航搜索

目录

docker

https://developer.aliyun.com/article/110806

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

systemctl start docker
service docker start
systemctl enable docker

docker清理

https://www.jianshu.com/p/470e29801be2

docker system df

清理旧容器及不用的镜像

docker system prune -a -f

停用全部运行中的容器:

docker stop $(docker ps -q)

2.删除全部容器:

docker rm $(docker ps -aq)

3.一条命令实现停用并删除容器:

docker stop $(docker ps -q) & docker rm $(docker ps -aq)
Docker空间占用查看
1.13版本后Docker提供给了一些System命令,例如df命令查看Docker占用分布:

$ docker system df
TYPE                TOTAL     ACTIVE    SIZE          RECLAIMABLE
Images              3         0         5.373GB       5.373GB (100%)
Containers          0         0         0B            0B
Local Volumes       0         0         0B            0B
$ docker system df -v 命令可以进一步查看空间占用细节,以确定是哪个镜像、容器或本地卷占用过高空间
清理方法
1 自动清理命令
docker system prune可对空间进行自动清理。
该命令所清理的对象如下:

已停止的容器
未被任何容器使用的卷
未被任何容器所关联的网络
所有悬空的镜像

对于上面提到的一些镜像或容器的状态,需要我们心里有点数:

已使用的镜像:指所有已被容器(包括stop的)关联的镜像,也就是docker ps -a所看到的所有容器对应的image。
未引用镜像:没有被分配或使用在容器中的镜像
悬空镜像(dangling image):未配置任何Tag(也就是无法被引用)的镜像。通常是由于镜像编译过程中未指定-t参数配置Tag导致的。

docker system prune后可以加额外的参数,如:
docker system prune -a : 一并清除所有未被使用的镜像和悬空镜像。
docker system prune -f : 用以强制删除,不提示信息。

另外除了system级别的,还有针对容器或是镜像级别的删除命令:

docker image prune:删除悬空的镜像。

docker container prune:删除无用的容器。
      --默认情况下docker container prune命令会清理掉所有处于stopped状态的容器
      --如果不想那么残忍统统都删掉,也可以使用--filter标志来筛选出不希望被清理掉的容器。例子:清除掉所有停掉的容器,但24内创建的除外:
      --$ docker container prune --filter "until=24h"  

docker volume prune:删除无用的卷。
docker network prune:删除无用的网络
手动清除
对于悬空镜像和未使用镜像可以使用手动进行个别删除:
1、删除所有悬空镜像,不删除未使用镜像:
docker rmi $(docker images -f "dangling=true" -q)
2、删除所有未使用镜像和悬空镜像
docker rmi $(docker images -q)
3、清理卷
如果卷占用空间过高,可以清除一些不使用的卷,包括一些未被任何容器调用的卷(-v 详细信息中若显示 LINKS = 0,则是未被调用):
删除所有未被容器引用的卷:
docker volume rm $(docker volume ls -qf dangling=true)
4、容器清理
如果发现是容器占用过高的空间,可以手动删除一些:
删除所有已退出的容器:
docker rm -v $(docker ps -aq -f status=exited)
删除所有状态为dead的容器
docker rm -v $(docker ps -aq -f status=dead)

作者:0过把火0
链接:https://www.jianshu.com/p/470e29801be2
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

手工安装

# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 更新并安装 Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start

注意:其他注意事项在下面的注释中
# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,你可以通过以下方式开启。同理可以开启各种测试版本等。
# vim /etc/yum.repos.d/docker-ce.repo
#   将 [docker-ce-test] 下方的 enabled=0 修改为 enabled=1
#
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
#   Loading mirror speeds from cached hostfile
#   Loaded plugins: branch, fastestmirror, langpacks
#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            docker-ce-stable
#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            @docker-ce-stable
#   docker-ce.x86_64            17.03.0.ce-1.el7.centos            docker-ce-stable
#   Available Packages
# Step2 : 安装指定版本的Docker-CE: (VERSION 例如上面的 17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]
# 注意:在某些版本之后,docker-ce安装出现了其他依赖包,如果安装失败的话请关注错误信息。例如 docker-ce 17.03 之后,需要先安装 docker-ce-selinux。
# yum list docker-ce-selinux- --showduplicates | sort -r
# sudo yum -y install docker-ce-selinux-[VERSION]

# 通过经典网络、VPC网络内网安装时,用以下命令替换Step 2中的命令
# 经典网络:
# sudo yum-config-manager --add-repo http://mirrors.aliyuncs.com/docker-ce/linux/centos/docker-ce.repo
# VPC网络:
# sudo yum-config-manager --add-repo http://mirrors.could.aliyuncs.com/docker-ce/linux/centos/docker-ce.repo

docker-compose

https://docs.docker.com/compose/install/

sudo curl -L "https://github.com/docker/compose/releases/download/1.28.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

Note: If the command docker-compose fails after installation, check your path. You can also create a symbolic link to /usr/bin or any other directory in your path.

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

Optionally, install command completion for the bash and zsh shell.

Test the installation.

$ docker-compose --version
docker-compose version 1.28.5, build 1110ad01

harbor

https://www.jianshu.com/p/bf92835a83ce

cd /alidata/harbor
wget https://github.com/goharbor/harbor/releases/download/v2.2.0/harbor-offline-installer-v2.2.0.tgz
tar –xzf    harbor-offline-installer-v2.2.0.tgz

vi harbor.yml
# The IP address or hostname to access admin UI and registry service.
# DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients.
# 自行更改为服务器内部ip
hostname: 192.168.186.129
 ./install.sh

若需要修改配置

docker-compose down -v
vi harbor.yml
prepare
docker-compose up -d

重启

docker-compose stop
docker-compose start
cd /alidata/harbor/harbor
docker-compose stop
cd /alidata/harbor/harbor
docker-compose start

修改docker镜像和容器位置

 df -lh
du -sh *
#删除所有镜像(在使用的不受影响)
docker rmi $(docker images -q)
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://3ue1wki2.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"insecure-registries": ["192.168.121.226"],"graph":"/data/tools/docker","registry-mirrors": ["https://3ue1wki2.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
vim /usr/lib/systemd/system/docker.service

修改ExecStart行为下面内容

ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock 
systemctl daemon-reload // 1,加载docker守护线程
systemctl restart docker // 2,重启docker

测试

docker -H tcp://127.0.0.1:2375 ps

centos8 containerd.io >= 1.2.2-3

https://download.docker.com/linux 找最新版本

yum update
yum install https://download.docker.com/linux/centos/8/x86_64/stable/Packages/containerd.io-1.3.7-3.1.el8.x86_64.rpm

常用链接

参考文档 官方文档 Docker的安装配置及使用详解

docker daemon命令-docker运行可指定项详解

总结

  • 容器生命周期管理 — docker [run|start|stop|restart|kill|rm|pause|unpause]
  • 容器操作运维 — docker [ps|inspect|top|attach|events|logs|wait|export|port]
  • 容器rootfs命令 — docker [commit|cp|diff]
  • 镜像仓库 — docker [login|pull|push|search]
  • 本地镜像管理 — docker [images|rmi|tag|build|history|save|import]
  • 其他命令 — docker [info|version]

Docker life.png

docker安装与启动

uname -r
yum update
https://yq.aliyun.com/articles/110806?spm=5176.100239.blogcont7695.11.ExyqD4
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 更新并安装 Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start
#开机启动
systemctl enable docker.service
# 注意:
# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,你可以通过以下方式开启。同理可以开启各种测试版本等。
# vim /etc/yum.repos.d/docker-ee.repo
#   将 [docker-ce-test] 下方的 enabled=0 修改为 enabled=1
#
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
#   Loading mirror speeds from cached hostfile
#   Loaded plugins: branch, fastestmirror, langpacks
#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            docker-ce-stable
#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            @docker-ce-stable
#   docker-ce.x86_64            17.03.0.ce-1.el7.centos            docker-ce-stable
#   Available Packages
# Step2 : 安装指定版本的Docker-CE: (VERSION 例如上面的 17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]
sudo tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF

yum install docker-engine

yum  install iptables
yum -y install iptables-services
curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh -
systemctl enable docker.service
systemctl start docker

docker run --rm hello-world


groupadd docker
usermod -aG docker root
usermod -aG docker dockeruser`
docker run --rm hello-world

yum install -y epel-release
yum install docker-io # 安装docker
# 配置文件 /etc/sysconfig/docker

chkconfig docker on  # 加入开机启动
service docker start # 启动docker服务

# 基本信息查看
docker version # 查看docker的版本号,包括客户端、服务端、依赖的Go等
docker info # 查看系统(docker)层面信息,包括管理的images, containers数等
docker pull centos 下载
docker images [ centos ] 查看
docker run -i -t centos /bin/bash

配置Docker加速器

https://cr.console.aliyun.com/?spm=5176.1971733.0.2.qkAS7f&accounttraceid=ff9c7f89-614f-42ef-8374-3d3ef4c57ace#/accelerator

针对Docker客户端版本大于1.10的用户

您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://3ue1wki2.mirror.aliyuncs.com"],
  "insecure-registries": [
    "127.0.0.1:8889"
  ],
  "disable-legacy-registry": true
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

手工添加 --registry-mirror=https://3ue1wki2.mirror.aliyuncs.com

如果通过阿里安装的docker无法运行,请检查/etc/systemd/system/docker.service 中 ExecStart=/usr/bin/docker daemon是否正确

cp -n /lib/systemd/system/docker.service /etc/systemd/system/docker.service
vi /etc/systemd/system/docker.service

修改后执行

systemctl daemon-reload
service docker restart

最终结果如下

[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.com
After=network.target rhel-push-plugin.socket
Wants=docker-storage-setup.service

[Service]
Type=notify
NotifyAccess=all
EnvironmentFile=-/etc/sysconfig/docker
EnvironmentFile=-/etc/sysconfig/docker-storage
EnvironmentFile=-/etc/sysconfig/docker-network
Environment=GOTRACEBACK=crash
ExecStart=/usr/bin/docker daemon -H unix:///var/run/docker.sock -H 0.0.0.0:2375 --registry-mirror=https://pee6w651.mirror.aliyuncs.com --registry-mirror=https://3ue1wki2.mirror.aliyuncs.com \
          --exec-opt native.cgroupdriver=systemd \
          $OPTIONS \
          $DOCKER_STORAGE_OPTIONS \
          $DOCKER_NETWORK_OPTIONS \
          $ADD_REGISTRY \
          $BLOCK_REGISTRY \
          $INSECURE_REGISTRY
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
TimeoutStartSec=0
MountFlags=slave
Restart=on-abnormal

[Install]
WantedBy=multi-user.target

user group

groupadd docker
usermod -aG docker your_username`
  • Log out and log back in.

This ensures your user is running with the correct permissions. Verify that your user is in the docker group by running docker without sudo.

docker run --rm hello-world

开机启动

Once Docker is installed, you will need to start the Docker daemon.

systemctl start docker

or on older distributions, you may need to use

service docker start

If you want Docker to start at boot, you should also:

 systemctl enable docker

or on older distributions, you may need to use

chkconfig docker on

配置docker

更多参考Customizing docker

打开docker远程管理端口2375,并配置docker hub国内仓库

编辑docker文件:/usr/lib/systemd/system/docker.service

vim /usr/lib/systemd/system/docker.service

修改ExecStart行为下面内容

ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock 

重新加载docker配置

systemctl daemon-reload // 1,加载docker守护线程
systemctl restart docker // 2,重启docker

测试

docker -H tcp://127.0.0.1:2375 ps

  • 新建docker配置文件
vim /etc/sysconfig/docker

增加

DOCKER_OPTS="-H unix:///var/run/docker.sock -H 0.0.0.0:2375"

如果需要通过代理访问还需要增加

HTTP_PROXY=http://代理用户名:密码@代理地址:端口
  • 启动docker守护进程时加载配置文件
<s>vim /lib/systemd/system/docker.servic
vi /etc/systemd/system/docker.service

在[Service]中增加配置文件路径的配置

EnvironmentFile=-/etc/sysconfig/docker

修改ExecStart配置为

ExecStart=/usr/bin/dockerd $DOCKER_OPTS

或直接修改

vi /etc/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.com
After=network.target rhel-push-plugin.socket
Wants=docker-storage-setup.service

[Service]
Type=notify
NotifyAccess=all
EnvironmentFile=-/etc/sysconfig/docker
EnvironmentFile=-/etc/sysconfig/docker-storage
EnvironmentFile=-/etc/sysconfig/docker-network
Environment=GOTRACEBACK=crash
ExecStart=/usr/bin/docker daemon -H unix:///var/run/docker.sock -H 0.0.0.0:2375 --registry-mirror=https://pee6w651.mirror.aliyuncs.com --registry-mirror=https://3ue1wki2.mirror.aliyuncs.com \
          --exec-opt native.cgroupdriver=systemd \
          $OPTIONS \
          $DOCKER_STORAGE_OPTIONS \
          $DOCKER_NETWORK_OPTIONS \
          $ADD_REGISTRY \
          $BLOCK_REGISTRY \
          $INSECURE_REGISTRY
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
TimeoutStartSec=0
MountFlags=slave
Restart=on-abnormal

[Install]
WantedBy=multi-user.target
  • 重启docker守护进程
systemctl daemon-reload
systemctl stop docker
systemctl start docker
  • 检查配置是否生效
ps -ef|grep docker
netstat -ntlp
docker -H tcp://127.0.0.1:2375 ps

如果配置生效,会在dockerd进程后边加上刚才配置的参数。

</s>

docker常用命令

docker images

docker run

Container explainer.png

docker run ubuntu /bin/echo 'Hello world'
docker run -t -i ubuntu /bin/bash
docker run runs a container.
ubuntu is the image you would like to run.
-t 表示在新容器内指定一个伪终端或终端,
-i表示允许我们对容器内的 (STDIN) 进行交互。
/bin/bash launches a Bash shell inside our container.
exit
docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
d 标识告诉 docker 在容器内以后台进程模式运行
可以通过docker ps查看运行的容易的名称NAMES
docker logs NAMES 查看容器输出日志

更多参考Docker run 命令的使用方法

在Docker中运行一个web应用

docker run -d -P --name training/webapp python app.py
-d 标识是让 docker 容器在后台运行。新的 
-P 标识通知 Docker 将容器内部使用的网络端口映射到我们使用的主机上。现在让我们看看我们的 web 应用
--name标识来命名容器

docker run -d -p 5000:5000 training/webapp python app.py
Docker 能够很容易的配置和绑定网络端口。在最后一个例子中 -P 标识(flags)是 -p 5000 的缩写,它将会把容器内部的 5000 端口映射到本地 Docker 主机的高位端口上(这个端口的通常范围是 32768 至 61000)。我们也可以指定 -p 标识来绑定指定端口。举例:
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
绑定UDP端口,我们可以在后面添加/udp 

docker port nostalgic_morse 5000
使用docker port快捷方式来绑定我们的端口,这有助于向我们展示特定的端口。例如我们绑定localhost,如下是docker port输出

容器连接

docker run -d --name db training/postgres
docker run -d -P --name web --link db:db training/webapp python app.py
--link name:alias
name是我们连接容器的名字,alias是link的别名。让我们看如何使用alias。

停止容器

docker stop name/id

容器日志查看

docker logs -f nostalgic_morse

查看容器

   docker ps :列出当前所有正在运行的container
   docker ps -l :列出最近一次启动的container
   docker ps -a :列出所有的container(包含历史,即运行过的container)
   docker ps -q :列出最近一次运行的container ID

再次启动容器

   docker start/stop/restart <container> #:开启/停止/重启container
   docker start [container_id] #:再次运行某个container (包括历史container)

进入正在运行的docker容器

   docker exec -it [container_id] /bin/bash
   docker run -i -t -p <host_port:contain_port> #:映射 HOST 端口到容器,方便外部访问容器内服务,host_port 可以省略,省略表示把 container_port 映射到一个动态端口。

删除容器

   docker rm <container...> #:删除一个或多个container
   docker rm `docker ps -a -q` #:删除所有的container
   docker ps -a -q | xargs docker rm #:同上, 删除所有的container
   docker rm $(docker ps -a -q) #删除所有停止的container

创建镜像

注意最后的.

docker run docker/whalesay cowsay boo-boo
mkdir mydockerbuild
cd mydockerbuild
touch Dockerfile
 

vi Dockerfile


FROM docker/whalesay:latest 
MAINTAINER ling
RUN apt-get -y update && apt-get install -y fortunes
RUN apt-get update && apt-get install -y ruby ruby-dev
RUN gem install sinatra
CMD /usr/games/fortune -a | cowsay


docker build -t docker-whale .
# Format: sudo docker build --tag/-t <user-name>/<repository> .
# Example:
docker build --tag my/repo .
  • FROM 是告诉 Docker 使用的哪个镜像源
  • MAINTAINER 指令来指定谁在维护这个新镜像
  • RUN 指令在镜像内执行一条命令,例如:安装一个包。这里我们更新了 APT 的缓存,并且安装 Ruby 和 RubyGems ,然后使用 gem 安装 Sinatra
  • docker build 命令并指定 -t 标识(flag)来标示属于 ouruser ,镜像名称为 sinatra,标签是 v2。
  • 如果 Dockerfile 在我们当前目录下,我们可以使用 . 来指定 Dockerfile
  • Dockerfile 中的每一条命令都一步一步的被执行。我们会看到每一步都会创建一个新的容器,在容器内部运行指令并且提交更改 - 就像我们之前使用的 docker commit 一样。当所有的指令执行完成之后,我们会得到97feabe5d2ed 镜像(也帮助标记为 ouruser/sinatra:v2), 然后所有中间容器会被清除
  • 镜像不能超过127层。这是一种全局设置,为了是从整体上来优化镜像的大小

更新并且提交更改

  • 更新镜像之前,我们需要使用镜像来创建一个容器。
docker run -t -i training/sinatra /bin/bash
  • 修改镜像
  • 提交镜像
docker commit -m="Added json gem" -a="Kate Smith" 0b2616b0e5a8 ouruser/sinatra:v2
-m 标识我们指定提交的信息,就像你提交一个版本控制。
-a 标识允许对我们的更新来指定一个作者。
我们先给这个镜像分配了一个新用户名字 ouruser,接着,未修改镜像名称,保留了原有镜像名称sinatra;最后为镜像指定了标签(tag) v2
docker images 查看结果

删除镜像

docker rmi -f 7d9495d03763
docker rmi -f docker-whale

上传镜像

Tagger.png

例如在https://hub.docker.com的用户名为102010cncger创建的REPOSITORY为docker-whale 则命令如下 7d9495d03763 为image id

docker tag 7d9495d03763 102010cncger/docker-whale:latest
docker login
docker push 102010cncger/docker-whale
docker push 102010cncger/centos:v1


docker login --username=102010cncger@sina.com registry.cn-hangzhou.aliyuncs.com
docker push registry.cn-hangzhou.aliyuncs.com/ling/deloitte.cloud.server.eureka:latest

network

更多参考Docker intercontainer 网络解释 Docker网络详解

docker network ls
network inspect bridge
docker run -itd --name=networktest ubuntu
docker network disconnect bridge networktest
docker network create -d bridge my-bridge-network
docker run -d --network=my-bridge-network --name db training/postgres

  connect     Connect a container to a network
  create      Create a network
  disconnect  Disconnect a container from a network
  inspect     Display detailed information on one or more networks
  ls          List networks
  rm          Remove one or more networks

其他基础命令

docker top 查看容器内部运行的进程
docker inspect  查看Docker的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息
docker version
docker --help
docker attach --help
docker-machine ip
docker images --digests | head


重启策略

使用在Docker run的时候使用--restart参数来设置。

no - container不重启

on-failure - container推出状态非0时重启

always - 始终重启

https://docs.docker.com/reference/commandline/cli/#restart-policies

docker run --restart=always redis


docker run --restart=on-failure:10 redis

文件拷贝

管理容器数据

Shared-uuid.jpg

  • Docker管理数据的两种主要的方法:
    • 数据卷
    • 数据卷容器

Multiple containers can also share one or more data volumes. However, multiple containers writing to a single shared volume can cause data corruption. Make sure your applications are designed to write to shared data stores.

Data volumes are directly accessible from the Docker host. This means you can read and write to them with normal Linux tools. In most cases you should not do this as it can cause data corruption if your containers and applications are unaware of your direct access.

When a container is deleted, any data written to the container that is not stored in a data volume is deleted along with the container.

A data volume is a directory or file in the Docker host’s filesystem that is mounted directly into a container. Data volumes are not controlled by the storage driver. Reads and writes to data volumes bypass the storage driver and operate at native host speeds. You can mount any number of data volumes into a container. Multiple containers can also share one or more data volumes.

Shared-volume.jpg

数据卷

数据卷是指在存在于一个或多个容器中的特定目录,此目录能够绕过Union File System提供一些用于持续存储或共享数据的特性。

  • 数据卷可在容器之间共享或重用
  • 数据卷中的更改可以直接生效
  • 数据卷中的更改不会包含在镜像的更新中
  • 数据卷的生命周期一直持续到没有容器使用它为止


docker run -d -P --name web -v /webapp training/webapp python app.py
docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py

window

docker run -v c:\<path>:/c:\<container path>
  • Dockerfile中使用VOLUME指令来给创建的镜像添加一个或多个数据卷
  • 可以在一次docker run命令中多次使用-v标识挂载多个数据卷
  • 这将会把本地目录/src/webapp挂载到容器的/opt/webapp目录。这在做测试时是非常有用的,例如我们可以挂载宿主机的源代码到容器内部,这样我们就可以看到改变源代码时的应用时如何工作的。宿主机上的目录必须是绝对路径,如果目录不存在docker会自动创建它。
  • 注:出于可移植和分享的考虑,这种方法不能够直接在Dockerfile中实现。作为宿主机目录——其性质——是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。

docker默认情况下是对数据卷有读写权限,但是我们通过这样的方式让数据卷只读:

docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py

这里我们同样挂载了/src/webapp目录,只是添加了ro选项来限制它只读。

docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash

-v标识还可以将宿主机的一个特定文件挂载为数据卷

共享的数据卷

创建数据卷

docker volume create -d flocker -o size=20GB my-named-volume

挂载数据卷

run -d -P -v my-named-volume:/webapp 

docker run -d -P --volume-driver=flocker -v my-named-volume:/webapp --name web training/webapp python app.py

创建、挂载数据卷容器

  • 创建数据卷容器
docker create -v /dbdata --name dbstore training/postgres /bin/true
  • 挂载数据卷
docker run -d --volumes-from dbstore --name db1 training/postgres
docker run -d --volumes-from dbstore --name db2 training/postgres
  • 如果你想要容器之间数据共享,或者从非持久化容器中使用一些持久化数据,最好创建一个指定名称的数据卷容器,然后用它来挂载数据
docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres 创建一个指定名称的数据卷容器 
docker run -d --volumes-from dbdata --name db1 training/postgres 你可以在另外一个容器使用--volumes-from标识,通过刚刚创建的数据卷容器来挂载对应的数据卷 
docker run -d --volumes-from dbdata --name db2 training/postgres 可以将对应的数据卷挂载到更多的容器中
  • 数据卷容器是可以进行链式扩展的,之前的dbdata数据卷依次挂载到了dbdata 、db1和db2容器,我们还可以使用这样的方式来将数据卷挂载到新的容器db3:
docker run -d --name db3 --volumes-from db1 training/postgres
  • 即使你删除所有de 挂载了数据卷dbdata的容器(包括最初的dbdata容器和后续的db1和db2),数据卷本身也不会被删除。要删在磁盘上删除这个数据卷,只能针对最后一个挂载了数据卷的容器显式地调用docker rm -v命令。这种方式可使你在容器之间方便的更新和迁移数据。

备份、恢复或者迁移数据卷

  • 数据卷还可以用来备份、恢复或迁移数据。为此我们使用--volumes-from参数来创建一个挂载数据卷的容器,像这样:
docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata

这里我们启动了一个挂载dbdata卷的新容器,并且挂载了一个本地目录作为/backup卷。最后,我们通过使用tar命令将dbdata卷的内容备份到容器中的/backup目录下的backup.tar文件中。当命令完成或者容器停止,我们会留下我们的dbdata卷的备份。

然后,你可以在同一容器或在另外的容器中恢复此数据。创建一个新的容器

docker run -v /dbdata --name dbdata2 ubuntu /bin/bash

然后在新的容器中的数据卷里un-tar此备份文件。

docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar

你可以对熟悉的目录应用此技术,来测试自动备份、迁移和恢复。

删除数据卷

docker volume rm

A Docker data volume persists after a container is deleted. You can create named or anonymous volumes. Named volumes have a specific source form outside the container, for example awesome:/bar. Anonymous volumes have no specific source. When the container is deleted, you should instruct the Docker Engine daemon to clean up anonymous volumes. To do this, use the --rm option, for example:

docker run --rm -v /foo -v awesome:/bar busybox top

安装 eclipse che

docker run --rm -t -v /var/run/docker.sock:/var/run/docker.sock eclipse/che start

如果安装缓慢,那么请检查阿里加速是否安装成功


-t 启动终端
-v /var/run/docker.sock:/var/run/docker.sock 将 /var/run/docker.sock挂载为容器的/var/run/docker.sock

镜像广场

在本地 docker 环境中输入以下命令,就可以pull一个镜像到本地了

sudo docker pull index.tenxcloud.com/<namespace>/<repository>:<tag> 注意:为了在本地方便使用,拉取后您可以修改tag成短标签,比如

sudo docker tag index.tenxcloud.com/mysql:latst mysql:latest

  • 发布镜像

1. 在本地 docker 环境中输入以下命令进行登录。

sudo docker login index.tenxcloud.com 2. 假如在本地已经有了想要push的image,比如这个image名为hello-world。如果在本地没有image,可以首先从Docker官方网站去pull一个下来。

docker pull hello-world:latest 3. 然后,需要对这个image进行标记,在命令中输入:

sudo docker tag hello-world:latest index.tenxcloud.com/username/hello: latest(自定义仓库名); 4. 最后在命令行输入如下命令就可以push这个image到你创建的镜像仓库中了。

sudo docker push index.tenxcloud.com/username/hello:latest(自定义仓库名).

删除docker

列出你安装过的包

yum list installed | grep docker
yum list installed | grep docker
docker-engine.x86_64   1.7.1-1.el7 @/docker-engine-1.7.1-1.el7.x86_64.rpm

删除安装包

yum - y remove docker-engine.x86_64

删除镜像/容器等

rm -rf /var/lib/docker

详情请参阅:官网教程

Splunk logging driver

[1]

示例

Docker 中运行 MongoDB

ubuntu 基础进项基础工具安装

启动镜像并进入控制台

docker run -i -t ubuntu /bin/bash
 docker run -d ubuntu
docker run -t -i ubuntu /bin/bash

以上都不能exit,必须多开窗口
uname -r

安装vim

docker exec -it [container_id] /bin/bash

也可以用nano编辑

Ctrl + O     保存文件
Ctrl + X     退出编辑器
Ctrl + K     剪切行
Ctrl + U     粘贴
Ctrl + /       替换
Ctrl + W    查找
Ctrl + Y     上一屏幕
Ctrl + V     下一屏幕
Ctrl + P     向上移动一行
Ctrl + N     向下移动一行
Ctrl + F     向前移动光标一格
Ctrl + B     向后移动光标一格
Ctrl + G     调用帮助菜单
apt-get update
apt-get install vim

阿里镜像加速

cp /etc/apt/sources.list /etc/apt/sources.list.bak
vim /etc/apt/sources.list
[2] ubuntu版本参考

Ubuntu 16.04 LTS国内快速更新源

cp /etc/apt/sources.list /etc/apt/sources.list.bak
vim /etc/apt/source.list 

在文件最前面添加以下条目(操作前请做好相应备份)或替换

deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
##测试版源
deb http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
# 源码
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
##测试版源
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
# Canonical 合作伙伴和附加
deb http://archive.canonical.com/ubuntu/ xenial partner
deb http://extras.ubuntu.com/ubuntu/ xenial main
apt-get update
apt-get upgrade

centos阿里镜像

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum makecache

安装其他内容

安装需要的内容

安装完不能退出

提交并保存镜像

docker ps
docker commit eafd9111ada6 102010cncger/obuntu
docker commit -m="ubuntu base v1" -a="bo.wang" 0b2616b0e5a8 102010cncger/ubuntu:v1

上传镜像

docker build --tag -t 102010cncger/ubuntu .
docker tag 7d9495d03763 102010cncger/ubuntu:v1

docker login
docker push 102010cncger/ubuntu:v1

安装mongoDB

注意文件可执行 chmod 777

# Dockerizing MongoDB: Dockerfile for building MongoDB images
# Based on ubuntu:latest, installs MongoDB following the instructions from:
# http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/

FROM 102010cncger/ubuntu:v3
MAINTAINER DttCloud

#Install some
RUN apt-get clean
RUN apt-get update
RUN apt-get install -y g++
RUN apt-get install -y openssh-server 
RUN mkdir -p /var/run/sshd

#open port 22
EXPOSE 22
#CMD ["/usr/sbin/sshd", "-D"]

# Installation:
# Import MongoDB public GPG key AND create a MongoDB list file
RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10

ENV MONGO_MAJOR 3.2
ENV MONGO_MAJOR_V 3.2

RUN echo "deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/$MONGO_MAJOR  multiverse" | tee /etc/apt/sources.list.d/mongodb.list

# Install MongoDB
RUN apt-get update
RUN apt-get install -y mongodb

# Create the MongoDB data directory
RUN mkdir -p /data/db

# Expose port #27017 from the container to the host
EXPOSE 27017

# Set usr/bin/mongod as the dockerized entry-point application
ENTRYPOINT usr/bin/mongod
docker build -t 102010cncger/cloud:master .


推送 MongoDB 镜像到 Docker Hub

docker push 命令将会把镜像推送到 Docker Hub 上,你可以在 Docker Hub 上托管和分享推送的镜像。为此,你需要先登录:

# Log-in
$ sudo docker login
Username:
..

# Push the image
# Format: sudo docker push <user-name>/<repository>
$ sudo docker push my/repo
The push refers to a repository [my/repo] (len: 1)
Sending image list
Pushing repository my/repo (1 tags)

使用 MongoDB 的镜像

使用我们创建的MongoDB镜像,我们可以运行一个或多个的 MongoDB 守护进程。

# Basic way
# Usage: sudo docker run --name <name for container> -d <user-name>/<repository>
$ sudo docker run --name mongo_instance_001 -d my/repo

# Dockerized MongoDB, lean and mean!
# Usage: sudo docker run --name <name for container> -d <user-name>/<repository> --noprealloc --smallfiles
$ sudo docker run --name mongo_instance_001 -d my/repo --noprealloc --smallfiles

# Checking out the logs of a MongoDB container
# Usage: sudo docker logs <name for container>
$ sudo docker logs mongo_instance_001

# Playing with MongoDB
# Usage: mongo --port <port you get from `docker ps`> 
$ mongo --port 12345


docker run --name rs_server1 -p 21117:27017 -d 102010cncger/cloud:master --noprealloc --smallfiles --replSet rs1 
docker run --name rs_server2 -p 22117:27017 -d 102010cncger/cloud:master --noprealloc --smallfiles --replSet rs1 
docker run --name rs_server3 -p 23117:27017 -d 102010cncger/cloud:master --noprealloc --smallfiles --replSet rs1

查看网络

network inspect bridge

mongo官方docker镜像

 docker run --name some-mongo -v /my/own/datadir:/data/db -d mongo:tag

常见问题

/usr/lib/systemd/system/blk-availability.service from install of device-mapper-7:1.02.107-5.el7_2.5.x86_64 conflicts with file from package lvm2-7:2.02.105-14.el7.x86_64

解决办法:

yum install libdevmapper* -y

再次运行:

yum install docker

3.检查安装是否成功

docker version 

若输出了 Docker 的版本号,说明安装成功了,可通过以下命令启动 Docker 服务:

service docker start 

一旦 Docker 服务启动完毕,就可以开始使用 Docker 了。

/var/run/docker.sock: no such file or directory

这个错误可能是由于 Docker 后台进程没有启动。检查下 Docker 后台进程的状态,确认它已经处于启动状态:

service docker.io status
service docker.io start

Unable to locate package mongodb-org

[3]


At first try with this command:

sudo apt-get install -y mongodb

If the above command not working then you can fix the issue by one of the bellow procedure:

  1. Step 1: Import the MongoDB public key
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
  1. Step 2: Generate a file with the MongoDB repository url
echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list
  1. Step 3: Refresh the local database with the packages
sudo apt-get update
  1. Step 4: Install the last stable MongoDB version and all the necessary packages on our system
sudo apt-get install mongodb-org
sudo apt-get install -y mongodb


Hope this will work for you also. You can follow this MongoDB

Update The above instruction will install mongodb 2.6 version, if you want to install latest version for Uubuntu 12.04 then just replace above step 2 and follow bellow instruction instead of that:

  1. Step 2: Generate a file with the MongoDB repository url
echo "deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb.list

If you are using Ubuntu 14.04 then use bellow step instead of above step 2

  1. Step 2: Generate a file with the MongoDB repository url
echo "deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.0.list

No chain/target/match by that name

重启docker, 然后保存iptables-save 即可解决

Freezing execution

https://github.com/solita/docker-systemd/issues/1

Mount failed for selinuxfs on /sys/fs/selinux: Operation not permitted

Failed to mount tmpfs at /run: Permission denied

Failed to mount tmpfs at /run/lock: Permission denied

[!!!!!!] Failed to mount API filesystems, freezing.

Freezing execution.

/var/run/docker.sock: no such file or directory. Are you trying to connect to a TLS-enabled daemon without TLS?

 [4]
This error occurred because I didn't restart my computer after installing docker. Now the above command is working for me.

docker-engine-selinux conflicts with docker-selinux-1.10.3-46.el7.centos.14.

删除冲突的包

yum -y remove .....

Error response from daemon: driver failed programming external connectivity

yum -y remove iptables
yum -y install iptables
curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh -
systemctl enable docker.service
systemctl start docker

[5]

iptables: No chain/target/match by that nam

如果iptables是在docker后安装的,把docker重新安装下就可以了

systemctl daemon-reload
systemctl stop docker
systemctl start docker

ubuntu下root账户不能登录

sudo passwd root#设置root账户密码

server gave HTTP response to HTTPS client

vi /etc/docker/daemon.json
{ "insecure-registries":["10.10.239.222:5000"] }
systemctl restart docker

Error starting userland proxy: mkdir /port/tcp:0.0.0.0:80:tcp:172.17.0.2:80: input/output error.

window平台问题,重启docker后解决

Centos8安装Docker后容器内无法访问网络

iptables -L

临时关闭firewalld和docker服务

systemctl stop firewalld docker

清除现有防火墙规则 由于docker启动容器时会在iptables中添加规则,我们先把原来

iptables -P INPUT ACCEPT 先放行规则,非常重要!

否则22端口也就是你的SSH服务可能再也连不上了。

iptables -F 清除所有规则

开启端口转发 1、开启内核IP地址转发功能 首先查看内核是否开启IP地址转发功能

cat /proc/sys/net/ipv4/ip_forward

返回为1已开启,返回0则需要手动开一下。

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf 复制到终端上!以root用户身份执行。
sysctl -p 使更改立即生效。

2、防火墙放行IP地址转发 现在将firewalld服务启动

systemctl start firewalld

默认情况下firewalld会禁止转发流量,可以执行firewall-cmd --query-masquerade查看状态,应该是no,请执行下面的命令开启转发。

firewall-cmd --add-masquerade --permanent 永久开启IP地址转发
firewall-cmd --reload 重载防火墙规则,使之生效

启动Docker服务 现在可以启动docker服务检查容器网络是否正常。

systemctl start docker