1. 安装
官方地址一键安装: curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 或国内 daocloud 一键安装: curl -sSL https://get.daocloud.io/docker | sh 拆解: curl -fsSL https://get.docker.com -o get-docker.sh sh get-docker.sh
手动安装(centos为例):
移除旧版本 yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine 添加docker的yum源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 装包(可通过其完整的软件包名称安装特定版本,例如:docker-ce-18.09.1,默认最新版) yum install docker-ce docker-ce-cli containerd.io 启服务 systemctl start docker 卸载 yum remove docker-ce 删除镜像,容器,配置文件等残留 rm -rf /var/lib/docker
测试
docker run hello-world
下载镜像
docker pull 镜像名
常见报错:”Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.26/images/json: dial unix /var/run/docker.sock: connect: permission denied“
原因分析:使用非root用户运行docker。docker进程使用Unix Socket而不是TCP端口;而默认情况下,Unix socket属于root用户,需要root权限才能访问。
解决方法1
给当前用户配置sudo权限,使用sudo获取管理员权限,运行docker命令。
解决方法2
docker守护进程启动的时候,会默认赋予名字为docker的用户组读写Unix socket的权限,因此只要创建docker用户组,并将当前用户加入到docker用户组中,那么当前用户就有权限访问Unix socket了,进而也就可以执行docker相关命令
sudo groupadd docker #添加docker用户组 sudo gpasswd -a $USER docker #将登陆用户加入到docker用户组中 newgrp docker #更新用户组 docker ps #测试docker命令是否可以使用sudo正常使用
2. 常用命令
2.1 启容器 直接启容器 docker run 例: docker run ubuntu:15.10 /bin/echo "Hello world" 输出:hello world 交互式登陆容器内部 -t: 在新容器内指定一个伪终端或终端。 -i: 允许你对容器内的标准输入 (STDIN) 进行交互。
--name: 创建容器时,指定容器名
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash 使用exit退出伪终端 docker run -i -t 例: docker run -it --name test ubuntu:15.10 /bin/bash root@0123ce188bd8:/#exit 后台模式 -d:将容器进程挂在系统后台运行 docker run -d 例: docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done" 前台输出:容器ID 此时查看后台输出:docker logs 容器名/ID 停止容器 docker stop 容器名/ID
运行已停止的容器
docker start 容器名/ID
重启正在运行的容器
docker restart 容器名/ID
进入容器
-
docker attach 容器名/ID:如果从这个容器退出,会导致容器的停止。
-
docker exec -it 容器名/ID /bin/bash:推荐大家使用 docker exec 命令,因为此命令会退出容器终端,但不会导致容器的停止。
web容器运行示例:
在docker容器中运行一个 Python Flask 应用来运行一个web应用。
启服务
docker pull training/webapp # 载入镜像 docker run -d -p 10.10.1.10:8080:5000 training/webapp python app.py --name webapp01
-
-d:让容器在后台运行。
-
-P:不加参数,会直接将容器内部暴露的网络端口全部随机映射到我们使用的主机上。
- -P 5000:将5000端口映射到主机上,未指定主机端口,则随即映射到一个端口上,未指定IP,则为0.0.0.0。
- -p 8080:5000:将容器5000端口映射到主机8080端口(绑定主机8080端口和容器的5000端口)。
- -p 10.10.1.10:8080:5000:将容器IP10.10.1.10和端口5000映射到主机8080端口上。
- -P 10.10.1.10::5000:将容器IP10.10.1.10和端口5000随机映射到主机端口上。
- 多端口映射时,只需要多几个-p选项即可。
- 大写P不指定端口,小写p指定端口。
查看
# docker ps CONTAINER ID IMAGE COMMAND ... PORTS d3d5e39ed9d3 training/webapp "python app.py" ... 10.10.1.10:8080->5000/tcp
# docker port webapp01
5000/tcp->10.10.1.10:8080
Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 8080上。即外部访问端口为8080。
停止
docker stop webapp01
移除
docker rm webapp01
注:移除容器需要先停止容器,然后再移除,否则会报错。
2.2 查看
查看正在运行的容器 docker ps
查看所有容器
docker ps -a
查看最后一次,创建的容器
docker ps -l
输出详情介绍: CONTAINER ID: 容器 ID。 IMAGE: 使用的镜像。 COMMAND: 启动容器时运行的命令。 CREATED: 容器的创建时间。 STATUS: 容器状态。 状态有7种: created(已创建) restarting(重启中) running 或 Up(运行中) removing(迁移中) paused(暂停) exited(停止) dead(死亡) PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。 NAMES: 自动分配的容器名称。
2.3 镜像
查找镜像(先本地仓库查找,再网络仓库查找)
docker search 镜像名(关键词)
查看本地镜像
docker images 下载镜像 docker pull 镜像名
删除镜像
docker rmi 镜像名
创建/更新镜像
docker commit -m="only for test v1" -a="santiagod" e321bcd0987 santiagod/webapp01:v1
-
-m: 提交的描述信息
-
-a: 指定镜像作者
-
e321bcd0987:容器名/ID
-
santiagod/webapp01: 指定要创建的目标镜像名
- :v1: tag标签v1
修改镜像名和标签
先查看镜像ID
docker images
再修改镜像名(只改标签则镜像名不变,只改镜像名则不写标签或者标签不变)
docker tag ID 新镜像名:新标签
最后删除原来的镜像
docker rmi 镜像名
修改端口 1. 可以先将当前容器,提交镜像,然后重启时修改端口。 docker ps 查容器名/id docker commit 提交新镜像 docker run -p 修改端口,启用新容器 docker stop 停止旧容器 docker rm 删除旧容器容器
docker rename 新容器名 旧容器名
理论上可以无缝衔接,但需要考虑的是,容器ID变了,是否会造成其他影响
2. 修改j容器son文件 注:只重启容器配置修改不会生效,需要先停止docker服务,但相应的容器也随之停止。 systemctl stop docker 配置文件路径/var/lib/docker/containers/容器ID 先修改hostconfig.json; 如果之前没有端口映射, 应该有这样的一段: “PortBindings”:{} 增加一个映射, 这样写: “PortBindings”:{“8080/tcp”:[{“HostIp”:””,“HostPort”:“60000”}]} 前一个数字是容器端口, 后一个是宿主机端口。将宿主机的60000端口映射到容器的8080端口 而修改现有端口映射更简单, 把此处的端口号改掉就行。 sed -i 's/8081/8008/' /var/lib/docker/containers/7d378d1ff205b9a1d08eb91b881e9c1b2fe81f10bfc2c56abd759d20b9ea63b9/hostconfig.json
如果有config.v2.json文件,需要视情况修改,以下IP都是容器内部IP
"ExposedPorts":{ "80/tcp":{ }}
当然如果添加多端口映射,可参考以下内容
hostconfig.json
“PortBindings”:{“80/tcp”:[{“HostIp”:””,“HostPort”:“8080”}],“3306/tcp”:[{“HostIp”:””,“HostPort”:“33060”}],“XXX/tcp”:[{“HostIp”:””,“HostPort”:“xxx”}]}
config.v2.json
"ExposedPorts":{ "80/tcp":{ },"3306/tcp":{ },"XXXX/tcp":{ }}
然后启docker systemctl restart docker 接着启容器 docker start 7d378d1ff205b
标签:容器,8080,端口,学习,镜像,docker,ID From: https://www.cnblogs.com/santia-god/p/16815873.html