Ubuntu 18.04
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
首先保险起见,尝试清理一下系统中的 Docker 旧组件或版本:
sudo apt-get remove docker docker-engine docker.io containerd runc
尝试更新一下软件源索引:
sudo apt-get update
安装一些系统依赖组建:
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
添加 Docker 官方的公钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
这一步如果失败并提示以下错误信息:
这是由于GitHub release文件被墙导致下载失败了。
解决办法:
百度ipaddress,查找被墙网址的ip:
然后 vi /etc/hosts
命令在 hosts文件末尾中加入以下内容:
52.216.107.188 github-com.s3.amazonaws.com
重新执行上述添加公钥的命令即可成功。
验证一下公钥,输出应该为: 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
sudo apt-key fingerprint 0EBFCD88
添加 Docker 官方的软件源:
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
再次更新软件源索引:
sudo apt-get update
可以开始安装 Docker,执行命令后等待就可以:
sudo apt-get install docker-ce docker-ce-cli containerd.io
如果你不是root用户,请将用户加入docker用户组:
sudo usermod -aG docker $(whoami)
重启虚拟机即可生效。
最后就是安装 docker-composer 辅助命令了,如果项目要使用到多个 docker 容器,那它就是你的福音,安装方式有点特殊,也很简单,就是直接下载文件,放入系统命令目录,赋予执行权限就可以了:
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
检查docker的安装
docker version
运行第一个容器
docker run hello-world
docker run -it ubuntu bash
-it参数:通过终端与进程(容器)交互,stdin,stdout,stderr定向到 TTY
如果没有-it参数,执行上述命令无法为容器分配伪输入终端,无法开启交互模式。
显示本地镜像内容:
docker images
docker ps
docker ps -a
拉取MySQL镜像:
这一步比较曲折,试了好几种办法都失败了,记录一下没能成功的尝试过程。
直接拉取:
docker pull mysql:5.7
结果:连接失败,提示TLS hand handshake timeout。
在docker文件夹下配置daemon.json, 修改docker的registry-mirrors:
{"registry-mirrors": ["http://hub-mirror.c.163.com"]}
或
{"registry-mirrors": ["http://4e70ba5d.m.daocloud.io"]}
然后service restart docker
重启服务器
结果:可以下载,一开始速度挺快,然后越来越慢,到最后直接卡住。
最后一种办法拉取成功了:通过国内镜像daocloud.io/library库下载
docker pull daocloud.io/library/mysql:5.7
~] mkdir mydock && cd mydock
mydock]# vi dockerfile
录入一下内容:
FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]
构建镜像:
docker build . -t hello
docker images hello
docker run -it --rm hello -H
启动服务器:
sudo docker run -p 3306:3306 --name mysql2 -e MYSQL_ROOT_PASSWORD=root -d daocloud.io/library/mysql:5.7
docker ps
docker run -it --net host daocloud.io/library/mysql:5.7 "sh"
mysql -h127.0.0.1 -P3306 -uroot -proot
docker rm $(docker ps -a -q) -f -v
docker volume create mydb
docker run --name mysql2 -e MYSQL_ROOT_PASSWORD=root -v mydb:/var/lib/mysql -d daocloud.io/library/mysql:5.7
上述命令的作用就是将自己定义的数据卷挂载到 /var/lib/mysql 上。
docker run --name myclient --link mysql2:mysql -it mysql:5.7 bash
env
mysql -hmysql -P3306 -uroot -proot
下载 Docker-compose 已经在部署 docker 时完成
docker network ls
docker run --name unet -it --rm ubuntu bash
apt-get update
apt-get install iputils-ping -y
ifconfig
ping
docker commit unet ubuntu:net
创建 mynet:
docker network create mynet
在两个窗口创建 u1,u2 容器网络:
docker network create u1
docker network create u2
并使用以下命令:
docker run --name u1 -it -p 8080:80 --net mynet --rm ubuntu:net bash
docker run --name u2 --net mynet -it --rm ubuntu:net bash
u1 ,u2 两个容器网络之间互相ping(u1 的 IP 是 172.21.0.2, u2 的 IP是172.21.0.3):
u1 / u2 ping 外部网络,如百度:
从结果可以看到,容器网络是可以连通外部网络的。
执行以下命令:
docker inspect u1
docker network connect bridge u1
docker network disconnect mynet u1
然后重新ping:
u1, u2之间无法ping通了,但依然可以ping通外部网络。
运行一个本地仓库:
docker run -d -p 5000:5000 --restart=always --name registry registry:2
从 Docker Hub 拉取镜像 ubuntu:16.04:
docker pull ubuntu:16.04
标记镜像:
docker tag ubuntu:16.04 localhost:5000/my-ubuntu
当标记的第一部分是主机名和端口时,Docker 在推送时将其解释为仓库的位置。
推送镜像到本地仓库:
docker push localhost:5000/my-ubuntu
docker image remove ubuntu:16.04
docker image remove localhost:5000/my-ubuntu
从仓库中拉取镜像:
docker pull localhost:5000/my-ubuntu
docker container stop registry && docker container rm -v registry
访问https://cr.console.aliyun.com/。
用淘宝或注册一个账号。
选择“容器镜像服务”。
登录:
docker login --username= registry.cn-shenzhen.aliyuncs.com
docker tag hello-world registry.cn-shenzhen.aliyuncs.com/beikenken/hello-world
上传:
docker push registry.cn-shenzhen.aliyuncs.com/beikenken/hello-world
docker run --rm hello-world
docker logout registry.cn-shenzhen.aliyuncs.com
检查 docker 的状态:
docker info
docker info --format {
{.ServerVersion}}
查看容器内进程:
docker top
容器详细信息:
docker inspect
docker inspect -f '{
{.NetworkSettings.IPAddress}}' 084f46eddf33
容器日志查看:
docker logs
ll
Portainer是一个可视化的容器镜像的图形管理工具,利用Portainer可以轻松构建,管理和维护Docker环境。 而且完全免费,基于容器化的安装方式,方便高效部署。
部署 portainer :
docker pull portainer/portainer
选择 aliyun 的镜像源很快。
docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer
访问9000端口可以查看图形化界面:
docker pull alpine
sudo curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" \
-d '{"Image": "alpine", "Cmd": ["echo", "hello world"]}' \
-X POST http://localhost/v1.41/containers/create
sudo curl --unix-socket /var/run/docker.sock -X POST http://localhost/v1.41/containers/8ddb074cfada0fdffaee4ffbee9131bedf625b1e6d789f0e438106e7af96555c/start
sudo curl --unix-socket /var/run/docker.sock -X POST http://localhost/v1.41/containers/8ddb074cfada0fdffaee4ffbee9131bedf625b1e6d789f0e438106e7af96555c/wait
curl --unix-socket /var/run/docker.sock -o - "http://localhost/v1.41/containers/8ddb074cfada0fdffaee4ffbee9131bedf625b1e6d789f0e438106e7af96555c/logs?stdout=1"