Apply rolling updates to a service


In a previous step of the tutorial, you scaledthe number of instances of a service. In this part of the tutorial, you deploy a service based on the Redis 3.0.6 container tag. Then you upgrade the service to use the Redis 3.0.7 container image using rolling updates.

  1. If you haven't already, open a terminal and ssh into the machine where you run your manager node. For example, the tutorial uses a machine named manager1.

  2. Deploy your Redis tag to the swarm and configure the swarm with a 10 second update delay. Note that the following example shows an older Redis tag:

    $docker service create\
    --replicas 3 \
    --name redis \
    --update-delay 10s \
    redis:3.0.6
    
    0u6a4s31ybk7yw2wyvtikmu50
    

    You configure the rolling update policy at service deployment time.

    The--update-delayflag configures the time delay between updates to a service task or sets of tasks. You can describe the timeTas a combination of the number of secondsTs,minutesTm,or hoursTh.So 10m30sindicates a 10 minute 30 second delay.

    By default the scheduler updates 1 task at a time. You can pass the --update-parallelismflag to configure the maximum number of service tasks that the scheduler updates simultaneously.

    By default, when an update to an individual task returns a state of RUNNING,the scheduler schedules another task to update until all tasks are updated. If at any time during an update a task returnsFAILED,the scheduler pauses the update. You can control the behavior using the --update-failure-actionflag fordocker service createor docker service update.

  3. Inspect theredisservice:

    $docker service inspect --pretty redis
    
    ID: 0u6a4s31ybk7yw2wyvtikmu50
    Name: redis
    Service Mode: Replicated
    Replicas: 3
    Placement:
    Strategy: Spread
    UpdateConfig:
    Parallelism: 1
    Delay: 10s
    ContainerSpec:
    Image: redis:3.0.6
    Resources:
    Endpoint Mode: vip
    
  4. Now you can update the container image forredis.The swarm manager applies the update to nodes according to theUpdateConfigpolicy:

    $docker service update --image redis:3.0.7 redis
    redis
    

    The scheduler applies rolling updates as follows by default:

    • Stop the first task.
    • Schedule update for the stopped task.
    • Start the container for the updated task.
    • If the update to a task returnsRUNNING,wait for the specified delay period then start the next task.
    • If, at any time during the update, a task returnsFAILED,pause the update.
  5. Rundocker service inspect --pretty redisto see the new image in the desired state:

    $docker service inspect --pretty redis
    
    ID: 0u6a4s31ybk7yw2wyvtikmu50
    Name: redis
    Service Mode: Replicated
    Replicas: 3
    Placement:
    Strategy: Spread
    UpdateConfig:
    Parallelism: 1
    Delay: 10s
    ContainerSpec:
    Image: redis:3.0.7
    Resources:
    Endpoint Mode: vip
    

    The output ofservice inspectshows if your update paused due to failure:

    $docker service inspect --pretty redis
    
    ID: 0u6a4s31ybk7yw2wyvtikmu50
    Name: redis
    ...snip...
    Update status:
    State: paused
    Started: 11 seconds ago
    Message: update paused due to failure or early termination of task 9p7ith557h8ndf0ui9s0q951b
    ...snip...
    

    To restart a paused update rundocker service update <SERVICE-ID>.For example:

    $docker service update redis
    

    To avoid repeating certain update failures, you may need to reconfigure the service by passing flags todocker service update.

  6. Rundocker service ps <SERVICE-ID>to watch the rolling update:

    $docker service ps redis
    
    NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
    redis.1.dos1zffgeofhagnve8w864fco redis:3.0.7 worker1 Running Running 37 seconds
    \_ redis.1.88rdo6pa52ki8oqx6dogf04fh redis:3.0.6 worker2 Shutdown Shutdown 56 seconds ago
    redis.2.9l3i4j85517skba5o7tn5m8g0 redis:3.0.7 worker2 Running Running About a minute
    \_ redis.2.66k185wilg8ele7ntu8f6nj6i redis:3.0.6 worker1 Shutdown Shutdown 2 minutes ago
    redis.3.egiuiqpzrdbxks3wxgn8qib1g redis:3.0.7 worker1 Running Running 48 seconds
    \_ redis.3.ctzktfddb2tepkr45qcmqln04 redis:3.0.6 mmanager1 Shutdown Shutdown 2 minutes ago
    

    Before Swarm updates all of the tasks, you can see that some are running redis:3.0.6while others are runningredis:3.0.7.The output above shows the state once the rolling updates are done.

Next steps

Next, you'll learn how to drain a node in the swarm.