docker的安装
- 下载docker-ce(社区版)的yum地址
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
- 替换为清华源地址,加快安装速度
sed -i 's#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo
- 执行yum安装命令进行安装
[root@docker ~]# yum install docker-ce -y
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
..................................................
已安装:
docker-ce.x86_64 3:18.09.7-3.el7
作为依赖被安装:
audit-libs-python.x86_64 0:2.8.4-4.el7
checkpolicy.x86_64 0:2.5-8.el7
container-selinux.noarch 2:2.99-1.el7_6
containerd.io.x86_64 0:1.2.6-3.3.el7
docker-ce-cli.x86_64 1:18.09.7-3.el7
libcgroup.x86_64 0:0.41-20.el7
libsemanage-python.x86_64 0:2.5-14.el7
policycoreutils-python.x86_64 0:2.5-29.el7_6.1
python-IPy.noarch 0:0.75-6.el7
setools-libs.x86_64 0:3.3.8-4.el7
作为依赖被升级:
policycoreutils.x86_64 0:2.5-29.el7_6.1
完毕!
- 执行docker wersion查看情况
[root@docker10 ~]# docker version
Client:
Version: 18.09.7
API version: 1.39
Go version: go1.10.8
Git commit: 2d0083d
Built: Thu Jun 27 17:56:06 2019
OS/Arch: linux/amd64
Experimental: false
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? #发现报错
- 启动docker并设置成开机自启动
[root@docker10 ~]# systemctl start docker
[root@docker10 ~]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
启动后发现命令无法补全,先确认已安装bash-completion,然后执行source /usr/share/bash-completion/bash_completion,发现按TAB键可以完成命令补全
- 重新执行docker version
[root@docker10 ~]# docker version
Client:
Version: 18.09.7
API version: 1.39
Go version: go1.10.8
Git commit: 2d0083d
Built: Thu Jun 27 17:56:06 2019
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 18.09.7
API version: 1.39 (minimum version 1.12)
Go version: go1.10.8
Git commit: 2d0083d
Built: Thu Jun 27 17:26:28 2019
OS/Arch: linux/amd64
Experimental: false
docker为客户端服务端共用的cs架构
- docker系统下的命令
[root@docker10 ~]# docker system
df events info prune
docker system:
系统命令 | 说明 | 译文 |
---|---|---|
df | Show docker disk usage | 硬盘资源 |
events | Get real time events from the server | 从服务器获取实时事件 |
info | Display system-wide information | 显示整个系统的信息 |
prune | Remove unused data | 删除未使用的数据 |
prune 批量删除
docker容器的主要组件:
镜像 容器 仓库 网络 存储(卷)
启动容器必须需要一个镜像,仓库中只存储镜像
容器---镜像---仓库
启动第一个容器
配置docker镜像加速
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
重启服务,使文件生效
[root@docker ~]# systemctl restart docker
启动一个nginx容器(先确保仓库内存在nginx才能启动,如果没有,可在接下来的步骤中直接pull一个)
docker run -d -p 80:80 nginx
[root@docker ~]# docker run -d -p 80:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
fc7181108d40: Pull complete
d2e987ca2267: Pull complete
0b760b431b11: Pull complete
Digest: sha256:96fb261b66270b900ea5a2c17a26abbfabe95506e73c3a3c65869a6dbe83223a
Status: Downloaded newer image for nginx:latest
fb7a6bccf23d8721a41f9f8808ade14b65e27ed5985d688fdd8567b054d4799c
run #(创建并运行一个容器)
-d #放在后台
-p #端口映射
nginx #docker镜像的名字
本地并未安装运行nginx,但通过容器可直接访问nginx
docker的镜像管理
- 1.搜索镜像
docker search (接镜像) - 2.获取镜像
docker pull(push)
镜像加速器:阿里云加速器,daocloud加速器,中科大加速器,Docker 中国官方镜像加速:https://registry.docker-cn.com
阿里云加速器:https://ii37ukg5.mirror.aliyuncs.com (通过加速器可加快pull镜像的时间)
下载一个centos6.8镜像
[root@docker ~]# docker pull centos:6.8
6.8: Pulling from library/centos
7ce0cebb9dca: Pull complete
Digest: sha256:39abd0c8e375de6fb7334d42ec2a46643f34cbc1bbaf37e2b484065f05eaa7a2
Status: Downloaded newer image for centos:6.8
- 3.查看镜像列表
docker images docker image ls
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f68d6e55e065 4 days ago 109MB
centos 6.8 82f3b5f3c58f 3 months ago 195MB
- 4.删除镜像
docker rmi
[root@docker ~]# docker image rm centos:6.8
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f68d6e55e065 4 days ago 109MB
例子:docker image rm centos:latest
- 5.导出镜像
docker save
[root@docker ~]# docker image save -o docker_nginx.tar.gz nginx:latest
#save 另存为 #-o 指定当前目录 docker_nginx.tar.gz 压缩包 nginx:latest 版本号
[root@docker ~]# ll
总用量 110444
-rw-------. 1 root root 1519 7月 4 16:31 anaconda-ks.cfg
-rw-------. 1 root root 113087488 7月 6 11:58 docker_nginx.tar.gz
第二种方法:docker image save centos > docker-centos7.4.tar.gz
- 6.导入镜像
docker load
[root@docker ~]# docker image load -i docker_centos.tar.gz
# load -i指定镜像路径
ad337ac82f03: Loading layer [==================================================>] 202.2MB/202.2MB
Loaded image: centos:6.8
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f68d6e55e065 4 days ago 109MB
centos 6.8 82f3b5f3c58f 3 months ago 195MB
例子:docker image load -i docker-centos7.4.tar.gz
docker容器的管理
docker 容器下的命令:
docker container:
系统命令 | 说明 | 译文 |
---|---|---|
attach | Attach local standard input, output, and error streams to a running container | 重新进入运行的容器中 |
commit | Create a new image from a container's changes | 根据容器的更改创建新镜像 |
cp | Copy files/folders between a container and the local filesystem | 在容器和本地文件系统之间复制文件/文件夹 |
create | Create a new container | 创建一个新的容器 |
diff | Inspect changes to files or directories on a container's filesystem | 检查容器文件系统中文件或目录的更改 |
exec | Run a command in a running container | 在正在运行的容器中运行命令 |
export | Export a container's filesystem as a tar archive | 将容器的文件系统导出为tar归档文件 |
inspect | Display detailed information on one or more containers | 在一个或多个容器上显示详细信息 |
kill | Kill one or more running containers | 杀死一个或多个正在运行的容器 |
logs | Fetch the logs of a container | 获取容器的日志 |
ls | List containers | 列出容器列表 |
pause | Pause all processes within one or more containers | 暂停一个或多个容器中的所有进程 |
port | List port mappings or a specific mapping for the container | 列出端口映射或容器的特定映射 |
prune | Remove all stopped containers | 移除所有已停止的容器 |
rename | Rename a container | 改名 |
restart | Restart one or more containers | 重启 |
rm | Remove one or more containers | 删除 |
run | Run a command in a new container | 运行 |
start | Start one or more stopped containers | 启动 |
stats | Display a live stream of container(s) resource usage statistics | 显示容器资源使用统计信息 |
stop | Stop one or more running containers | 停止一个或多个正在运行的容器 |
top | Display the running processes of a container | 显示容器的运行进程 |
unpause | Unpause all processes within one or more containers | 在一个或多个容器中暂停所有进程 |
update | Update configuration of one or more containers | 更新一个或多个容器的配置 |
wait | Block until one or more containers stop, then print their exit codes | 阻塞,直到一个或多个容器停止,然后打印它们的退出代码 |
- 1.启动一个容器
docker run (docker create + docker start)
[root@docker ~]# docker run -it --name wsm centos:6.8 /bin/bash
run(创建并运行一个容器)
-d 放在后台
-p 端口映射
-it 分配交互式的终端
--name 指定容器的名字
/bin/sh 覆盖容器的初始命令
- 显示容器列表
docker container ps
docker container ps -a (--all)
- 显示容器列表
[root@docker ~]# docker container ps --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d21722d07317 centos:6.8 "/bin/bash" About a minute ago Exited (130) 24 seconds ago wsm
fb7a6bccf23d nginx "nginx -g 'daemon of…" About an hour ago Up About an hour 0.0.0.0:80->80/tcp reverent_shannon
- 3.停止容器
docker container stop
[root@docker ~]# docker container stop fb7a6bccf23d
fb7a6bccf23d
- 4.杀掉容器
docker container kill
[root@docker ~]# docker container kill fb7a6bccf23d
fb7a6bccf23d
- 5.进入容器
docker container exec (会分配一个新的终端tty)
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
docker exec -it 容器id或容器名字 /bin/bash(/bin/sh)
docker container attach(使用同一个终端) 使用ctrl + p,ctrl + q 临时离开
docker attach [OPTIONS] CONTAINER
- 6.删除容器
docker container rm - 7.批量删除容器
docker rm -f `docker ps -a -q`
总结:docker容器内的第一个进程(初始命令)必须一直处于前台运行的状态(必须夯住),否则这个容器,就会处于退出状态!
docker端口映射
1.指定映射(docker 会自动添加一条iptables规则来实现端口映射)
-p hostPort:containerPort
-p ip:hostPort:containerPort 多个容器都想使用80端口
-p ip::containerPort(随机端口)
-p hostPort:containerPort:udp
-p 10.0.0.100::53:udp
-p 81:80 –p 443:443 可以指定多个-p2.随机映射
docker run -P (随机端口)
docker数据卷管理
作用:
容器的持久化
容器之间能实现数据共享
添加后的数据卷内数据与主机同步,即使容器停掉我们修改宿主机内的卷也可同步到容器内,重新开启并进入容器内便可查看宿主机上对卷的修改操作
直接命令添加数据卷
docker run -it -v /宿主机内绝对路径目录:/容器内目录 镜像名称 /bin/bash(如果报错加上试试)
使用dockerfile添加
--volumes -v
数据卷(文件或目录)
-v 卷名:/data
-v src(宿主机的目录):dst(容器的目录)
手动将容器保存为镜像
基于容器制作镜像
- 1.选择系统并安装服务
[root@docker ~]# docker run -it -p 1022:22 centos:6.9
[root@195ebf39117c /]# yum install -y openssh-server #安装ssh
[root@195ebf39117c /]# service sshd start #C6启动服务命令
Generating SSH2 RSA host key: [ OK ]
Generating SSH1 RSA host key: [ OK ]
Generating SSH2 DSA host key: [ OK ]
Starting sshd:
[root@195ebf39117c /]# echo 123456|passwd --stdin root #设置密码
Changing password for user root.
passwd: all authentication tokens updated successfully.
- 2.测试安装的服务可使用
- 3.提交为镜像
docker container commit 容器id或者容器的名字 新的镜像名字(版本号可选)
[root@docker ~]# docker container commit c8d569e8c58b centos6.9_ssh:v1
sha256:3b3df71e3b7320dfdb12916554f1333e45c6a2c337115ca0bbf9d730fbfec6ad
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos6.9_ssh v1 3b3df71e3b73 24 seconds ago 195MB #新提交的镜像
nginx latest f68d6e55e065 4 days ago 109MB
centos 6.8 82f3b5f3c58f 3 months ago 195MB
centos 6.9 2199b8eb8390 3 months ago 195MB
**注意:docker container commit 下镜像名称内不能包含大写字母,不能存在俩个:否则会报错!
[root@docker ~]# docker container commit c8d569e8c58b centos:6.9_ssh:v1
invalid reference format
- 4.测试镜像是否可使用
启动容器,容器正常运行
ssh 容器服务要持续运行,需在启动容器时添加/usr/sbin/sshd -D 使容器夯住才能保证容器启动运行
[root@docker01 ~]# docker run -d -p 1023:22 centos6.9_ssh:v1 /usr/sbin/sshd -D
48fe2e6d88f663488510ed5587b44fa550e4daafbce83c3bd75c43aa0fd2ebf9
注意:容器启动报WARNING: IPv4 forwarding is disabled. Networking will not work.错
[root@docker01 ~]# docker run -d -p 1023:22 centos6.9_ssh:v1 /usr/sbin/sshd -D
WARNING: IPv4 forwarding is disabled. Networking will not work.
5a92a182868008cf52d2c8ac6be85a040e8ff58f7b4e53e0d3b27dcb3d203d53
解决方法
- 1.修改 /usr/lib/sysctl.d/00-system.conf文件
添加net.ipv4.ip_forward=1代码至文件中
[root@docker01 ~]# vim /usr/lib/sysctl.d/00-system.conf
# Kernel sysctl configuration file
#
# For binary values, 0 is disabled, 1 is enabled. See sysctl(8) and
# sysctl.conf(5) for more details.
# Disable netfilter on bridges.
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
net.ipv4.ip_forward=1
- 2.重启网络
systemctl restart network - 3.重启docker服务
systemctl restart docker - 4.删除报错的容器,再次创建容器,便不会报错
此脚本为万能启动容器夯住的脚本,在启动容器时在后面执行脚本
vim init.sh
# /bin/bash
正常启动服务的命令
tail -F